質問1

質問1

script1.sh、、、script2.sh...、10のbashシェルスクリプトがあるとしますscript10.sh。最初は10個のファイルがすべて同じです。

では、各スクリプトで2つのことを変更したいと思います。

  1. 各ファイルの特定の行(たとえば、8行)を変更したいと思います。つまり、8行目のすべての項目を削除して次に置き換えます。「言葉なし」文字列を指定します。たとえば、次のように"This is line 8." なります。この問題しかし、彼らは置き換えを使用したいと思い、私は"AAA"8"BBB"行(それが何でも)を変更に変更したいと思います"This is line 8."

  2. 各ファイルで別の特定の行(21行など)を変更し、次に置き換えたいと思います。「変える」私が指定した文字列です。たとえば、script1.sh21行をに変更し、21行を21行に変更したいと思います。"XYZ"本質的に、これは関数へのいくつかの呼び出しです。script2.sh"PQR"script3.sh"ABC"(1)上記と同じです。ただし、すべてのファイルではなく別々のファイルで変更を行い、1つではなく10個の異なる文字列を指定することを除いてください。だから得るために(2)ここで、たぶん私が電話するかもしれません。(1)10の異なった時間、異なった変数。

bashvi、、などの一般的なLinuxプログラムを使用するソリューションに興味がありますawkgawk

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

  1. 真珠:

    for f in *.sh; do 
      perl -i -lne '$.==8 ? print "This is line 8" : print;' "$f"; 
    done
    
  2. 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

関連情報