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