テキストファイルでいっぱいのディレクトリがあります。私の目標は、それらすべての最初と最後にテキストを追加することです。最初と最後に表示されるテキストは、各ファイルで同じです。
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
両方iとaは、行番号だけでなく、特定のパターンに一致するすべての行でも機能します。これにより、行に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
コメント
回答
また、そうする権利があります(結果は.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)
コメント
- bufdoはPOSIXではないことに注意してください pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPennyは正しいです。 POSIXで指定された機能のみを、個人的にスクリプト編集に使用しています。
回答
gnu awkで、
拡張子とBEGINFILE / ENDFILE:
gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt
-iこのファイル置換は機能せず、stdoutに出力されるだけです。