script1.sh
、、、script2.sh
...、10のbashシェルスクリプトがあるとしますscript10.sh
。最初は10個のファイルがすべて同じです。
では、各スクリプトで2つのことを変更したいと思います。
各ファイルの特定の行(たとえば、8行)を変更したいと思います。つまり、8行目のすべての項目を削除して次に置き換えます。「言葉なし」文字列を指定します。たとえば、次のように
"This is line 8."
なります。この問題しかし、彼らは置き換えを使用したいと思い、私は"AAA"
8"BBB"
行(それが何でも)を変更に変更したいと思います"This is line 8."
。各ファイルで別の特定の行(21行など)を変更し、次に置き換えたいと思います。「変える」私が指定した文字列です。たとえば、
script1.sh
21行をに変更し、21行を21行に変更したいと思います。"XYZ"
本質的に、これは関数へのいくつかの呼び出しです。script2.sh
"PQR"
script3.sh
"ABC"
(1)上記と同じです。ただし、すべてのファイルではなく別々のファイルで変更を行い、1つではなく10個の異なる文字列を指定することを除いてください。だから得るために(2)ここで、たぶん私が電話するかもしれません。(1)10の異なった時間、異なった変数。
bash
vi
、、などの一般的なLinuxプログラムを使用するソリューションに興味がありますawk
。gawk
答え1
for file in f1 f2; do
sed -i '8s/^.*$/foo/' "$file"
done
答え2
awkを使う
for file in script1.sh script2.sh script3.sh ... script10.sh; do
temp=$(mktemp)
awk '
BEGIN {
line8 = "This is line 8"
line21["script1.sh"] = "XYZ"
line21["script2.sh"] = "PQR"
line21["script3.sh"] = "ABC"
# ...
}
FNR == 8 { print line8; next }
FNR == 21 && FILENAME in line21 { print line21[FILENAME]; next }
{print}
' "$file" > "$temp" && mv "$temp" "$file"
done
またはbashとsedを使用してください。
# bash variables to store new values. requires bash v4 for the associative array
line8="This is line 8"
declare -A line21=(
[script1.sh]="XYZ"
[script2.sh]="PQR"
[script3.sh]="ABC"
# ...
)
# then use sed
for file in script1.sh script2.sh script3.sh ... script10.sh; do
sed -i "8s/.*/$line8/; 21s/.*/${line21[$file]}/" "$file"
done
sed ソリューションでは、新しい行に「/」文字が含まれないように注意する必要があります。これはコマンドが中断されるためですs///
。別の区切り文字を使用できますがs|pattern|replacement|
(この場合、同じ警告が繰り返し適用されます)
ed
また利用できます:
for file in script1.sh script2.sh script3.sh ... script10.sh; do
ed "$file" <<ED_COMMANDS
8d
8i
$line8
.
21d
21i
${line21[$file]}
.
w
q
ED_COMMANDS
done
答え3
どちらの質問にも答えますが、原則としてこのような質問をマージするのではなく、別の投稿に分けてください。
質問1
真珠:
for f in *.sh; do perl -i -lne '$.==8 ? print "This is line 8" : print;' "$f"; done
awkとその変形:
for f in *.sh; do awk '{if(NR==8){print "This is line 8"}else{print}}' "$f" > fifo && mv fifo "$f"; done
質問2
まず、作成したい代替項目を含むファイルを作成します。たとえば、
script1.sh foo1
script2.sh foo2
script3.sh foo3
script4.sh foo4
その後、ファイルを読み取って交換を実行します。
while read f s; do
export s;
perl -i -lne '$.==8 ? print "$ENV{s}" : print;' "$f";
done < sublist.txt