在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
我确信这是基本的,所以指示正确的方向或示例非常受欢迎。
答案 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