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

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

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

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

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

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

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

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

回答

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

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 

回答

GNUsedを使用できます

すでに説明したように、照合の直前と直後にテキスト行を挿入できますsedを含むファイルの行。それぞれiおよび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 

回答

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

回答

これを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このファイル置換は機能せず、stdoutに出力されるだけです。
  • @OlehPrypin、確かにあなたの権利です。コメントは削除されました。

回答

また、そうする権利があります(結果は.outファイルになります):

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

もう1つの、より精巧なバリアント-ソースファイルが結果に置き換えられました:

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

回答

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

コメント

回答

gnu awkで、

拡張子とBEGINFILE / ENDFILE

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

回答

Perlワンライナーで救助:

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です