2

シェルで作業して、テキスト ファイル (テーブル) 内の "replace_me" のすべてのインスタンスを取得し、それを別のファイル (マーカー) の値に置き換えて、リストを段階的に下に移動したいと考えています。

つまり、テーブル内の "replace_me" の最初のインスタンスは、マーカーから "replaced_1" に置き換えられ、2 番目のインスタンスは、リストが使い果たされるまで "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 スタッフの数を知っていると仮定すると、解決策は次のようになります。

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 に答える