web-dev-qa-db-ja.com

Bashで複数のテキストファイルの最初と最後にテキストを追加するにはどうすればよいですか?

テキストファイルでいっぱいのディレクトリがあります。私の目標は、それらすべての最初と最後にテキストを追加することです。最初と最後に行くテキストは各ファイルで同じです。

私がWebから取得したコードに基づくと、これはファイルの先頭に追加するためのコードです。

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

これは、ファイルの最後に追加するためのコードです。目標は、各ファイルの最後に};というテキストを追加することです。

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

私が引用した例は、個々のファイルを操作するためのものでした。ワイルドカード*.txtを使用して、複数のファイルを操作してみようと思いました。

私も他の間違いをしているかもしれません。いずれにせよ、複数のファイルの最初と最後にテキストを追加するにはどうすればよいですか?

25
Questioner

テキストをファイルの先頭に追加するには、(GNU sedの実装で)使用できます):

sed -i '1i some string' file

テキストの追加は次のように簡単です

echo 'Some other string' >> file

最後に、それをループに入れて、編集するすべてのファイルを繰り返し処理します。

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done
29
Marco

GNU sed

すでに説明したように、sedコマンドとiコマンドをそれぞれ使用して、aでファイルの行を一致させる直前と直後にテキスト行を挿入できます。表示されていないのは、ワンライナーでmultiple filesを一度に実行できることです。

次の例では、最初の1iの前と最後の行$aの後に行を挿入します。挿入は、グロブ*.txtに一致するすべてのファイルに対して実行されます。

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

iaはどちらも、行番号だけでなく、特定のパターンに一致するすべての行でも機能します。これにより、行にvar y = 2;が含まれる場合は常にコメントが挿入されます。

sed -i -- '/var y = 2;/i//initialize variable y' *.js
9
J. Katzwinkel

ex を使用した完全にPOSIX準拠のコマンド:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

コマンドのprintfの部分を単独で実行すると、exに渡されている正確な編集コマンドが表示されます。

0a
var language = {
.
$a
};
.
x

0aは、「テキストを行0の後(つまり、最初の行の前)に追加する」を意味します。次の行は、行0の後に「追加」するリテラルテキストです。ピリオド(.)行自体に追加するテキストを終了します。

$aは、ファイルの最後の行の後にテキストを追加することを意味します。

xは、変更を保存して終了することを意味します。

5
Wildcard

Perlでこれを行う方法は次のとおりです。

for f in ./*txt; do
  Perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done
2
terdon

する権利もあります(結果は.outファイル):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

別の、より精巧な亜種-ソースファイルが結果に置き換えられました:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print
1
rook

gnu awkinplace拡張とBEGINFILE/ENDFILEを使用:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
1
don_crissti

exを使用してみてください:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

コマンドは次のとおりです。

  • bufdo!は、開かれた各バッファ/ファイルに対して以下のコマンドを実行します(注:それは [〜#〜] posix [〜#〜] ではありません)
  • 1s/^/HEAD/-最初の行の先頭にHEADテキストを挿入します
  • $s/$/TAIL/-最終行の行末にTAILテキストを追加します

引数は次のとおりです。

  • -s-サイレント/クイックモード
  • -cxa-開いているすべてのバッファ/ファイルを保存して終了します
  • *.foo-foo拡張子が付いた現在のディレクトリ(*)内のすべてのファイル。再帰性には**/*.fooを使用します(globstarを有効にした後:shopt -s globstar
1
kenorb

救済のためのPerlワンライナー:

Perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
0
Kjetil S.