bash - 使用循环将单个短语替换为列表中的不同短语

标签 bash if-statement for-loop sed replace

在 shell 中工作时,我想获取文本文件(表)中“replace_me”的所有实例,并将其替换为另一个文件(标记)中的值,在列表中逐步进行。

即表中“replace_me”的第一个实例将被标记中的“replaced_1”替换,第二个实例将被“replaced_2”替换,直到列表耗尽为止。

查看其他答案,我认为它必须类似于嵌套循环(for,然后 if),沿着这些思路,但我不确定如何使其实际工作,并逐步向下移动“标记” ' 列表。

#!/bin/bash
fileReplace='markers'
fileChange='table'
linesreplace=`cat $fileReplace`
lineschange=`cat $fileChange`

for line in $lineschange ; do

if $linechange = "replace_me"
sed "s/{$lineschange}/{$linesreplace}/g" 
else   
done

我确信这是基本的,因此非常欢迎指向正确方向的指针或示例。

最佳答案

将下一个脚本保存到文件中,例如do_replace.sh

replace_me="replace_me"
while read replace_to
do
    sed -i "" "1,/$replace_me/s/$replace_me/$replace_to/" $1
done

并运行它:

sh do_replace.sh file_where_need_replace.txt < file_with_replacements

例如来自 file_where_need_replace

aaa aaa aaa
replace_me bbb bbb
ccc ccc ccc
ddd replace_me ddd
eee eee eee
fff fff replace_me

具有以下替换内容:

111
222
333

将产生:

aaa aaa aaa
111 bbb bbb
ccc ccc ccc
ddd 222 ddd
eee eee eee
fff fff 333

或简单的 perl:

perl -ple 'BEGIN{@x=qx(cat replacements.txt);chomp @x}s/replace_me/shift(@x)/e' < where_to_replace.txt

关于bash - 使用循环将单个短语替换为列表中的不同短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11550731/

相关文章:

bash - 如何获取 tput smcup/rmcup 设置的屏幕状态?

linux - 在 BASH 脚本中使用 'awk' 将列添加到 CSV 文件的末尾

javascript - 在 Javascript 中,如果 if 语句不返回任何内容,则不执行任何操作

Javascript - 如果条件引用数组,则循环跳过内部代码

ios - Swift 中的 for 循环有问题

bash - 如何将可选标志和参数传递给 bash 脚本?

bash - Pop3 服务器中的 LIST 命令

java - 使用 boolean 对象

java - 简单的 if 语句无法正常工作

Javascript/React.js 相当于 Ruby .select{ |x|健康)状况 }