2

在 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

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

4

3 回答 3

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

例如来自 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
于 2012-07-18T22:59:51.293 回答
0

假设你知道replaceme stuff的数量,解决方案应该是这样的:

for i in {1..5}; do
 linesreplace= `head -${i} runjavareplicate.sh | tail -1`
 sed -i "s/${linechange}/${linesreplace}/" filename
done
于 2012-07-18T21:45:02.340 回答
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
于 2012-07-18T22:30:39.373 回答