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

Bash 使用循环将单个短语替换为列表中的不同短语,bash,if-statement,for-loop,sed,replace,Bash,If Statement,For Loop,Sed,Replace,在shell中工作时,我希望将文本文件(表)中的所有“replace_me”实例替换为另一个文件(标记)中的值,并在列表中以增量方式工作 i、 e.表中第一个“replace_me”实例将被markers中的“replace_1”替换,第二个实例将被“replaced_2”替换,直到列表用尽 环顾其他答案,我认为它必须类似于一个嵌套循环(for,然后if),沿着这些线,但我不确定如何使它实际工作,并逐步向下移动“标记”列表 #!/bin/bash fileReplace='markers' fi

在shell中工作时,我希望将文本文件(表)中的所有“replace_me”实例替换为另一个文件(标记)中的值,并在列表中以增量方式工作

i、 e.表中第一个“replace_me”实例将被markers中的“replace_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

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

假设您知道replaceme的数量,解决方案应该如下所示:

for i in {1..5}; do
 linesreplace= `head -${i} runjavareplicate.sh | tail -1`
 sed -i "s/${linechange}/${linesreplace}/" filename
done

根据您的问题,假设文件具有相同的行数似乎是合理的。希望这些评论能充分解释这里发生的事情:

#!/bin/bash

fileReplace='markers'
fileChange='table'
IFS=$'\n' # 'Internal Field Separator' affects how bash splits words (i.e. for arrays).
linesreplace=( $(<"$fileReplace") ) # Create a bash array from the lines of each file
lineschange=( $(<"$fileChange") ) 

for ((i=0; i<"${#linesreplace[@]}"; i++)); do # iterate numerically over the lines
    line="${lineschange[i]}"
    case "$line" in
        replace_me)
            printf '%s\n' "${linesreplace[i]}" # Print out the replaced line
        *)
            printf '%s\n' "$line" # Print out the original line
    esac
done
#/bin/bash
fileReplace='markers'
fileChange='table'
IFS=$'\n'#“内部字段分隔符”影响bash拆分单词的方式(即数组)。

linesreplace=($(将下一个脚本保存到文件中,例如
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
替换如下:

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
perl-ple'BEGIN{@x=qx(cat replacements.txt);chomp@x}s/replace_me/shift(@x)/e'
是一整行吗?您对ViM中的解决方案感兴趣吗?为什么要将搜索和替换字符串分开?一个文件会更有意义。缩进是您的(和我们的)朋友。@Shahbaz,谢谢你,这不是一整行。@Dennis Williamson,谢谢你,我下次会试试。我必须承认我不完全理解缩进惯例。如果你发现自己在循环中做
head | tail
,你就做错了。谢谢。我用我的数据尝试了第一个示例,然后用你提供的示例文件做了第一个示例e提供了t但有一条错误消息:“sed:can't read 1,/replace\u me/s/replace\u me/111/:没有这样的文件或目录。”我现在尝试第二个示例。您确定没有忘记“引号”吗?是的,引用与您的do_replace.shyes示例中的引用相同。文件有相同的行。我已找到上述解决方案,但我稍后将尝试此解决方案,因为您已花时间对所有内容进行了漂亮的注释。我肯定会学到一些东西!稍后将提供反馈,谢谢。
perl -ple 'BEGIN{@x=qx(cat replacements.txt);chomp @x}s/replace_me/shift(@x)/e' < where_to_replace.txt