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

时间:2012-07-18 21:35:17

标签: bash if-statement for-loop sed replace

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

即。表格中的“replace_me”的第一个实例将被标记中的“replacement_1”替换,第二个被“replacement_2”替换,直到列表用完为止。

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

#!/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

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

3 个答案:

答案 0 :(得分:2)

将下一个脚本保存到文件中,例如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

e.g。来自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

答案 1 :(得分:0)

假设您知道替换内容的数量,解决方案应该是这样的:

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

答案 2 :(得分:0)

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

#!/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