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


24

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

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

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

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

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

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

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

回答:


27

テキストをファイルの先頭に追加するには、(の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

8

GNU sedを使用できます

既に説明したようにsediおよびaをそれぞれ使用して、ファイルの行と一致する直前と直後にテキスト行を挿入できます。表示されていないのは、1行で複数のファイルを一度に処理できることです。

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

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

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

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

5

使用して、完全にPOSIXに準拠し、コマンド、ex

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 変更を保存して終了することを意味します。


2

Perlでそれを行う方法を次に示します。

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

@StéphaneChazelas -iは、このファイル置換の代わりに追加して機能せ、標準出力に出力されます。
オレPrypin

@OlehPrypin、確かにあなたの権利。コメントを削除しました。
ステファンシャゼル16年

1

使用してみてください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
@StevenPennyは正しい。 私は、スクリプトによる編集のために、POSIX指定の機能のみを個人的に使用しています
ワイルドカード

1

gnu awkinplace拡張子とBEGINFILE/ を使用してENDFILE

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

1

また、次の権利があります(結果が.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

0

Perlのワンライナーによる救助:

perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.