テキストファイルでいっぱいのディレクトリがあります。私の目標は、それらすべての最初と最後にテキストを追加することです。最初と最後に行くテキストは各ファイルで同じです。
私がWebから取得したコードに基づくと、これはファイルの先頭に追加するためのコードです。
echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt
これは、ファイルの最後に追加するためのコードです。目標は、各ファイルの最後に};
というテキストを追加することです。
echo "};" >> $BASEDIR/Translations/Javascript/*.txt
私が引用した例は、個々のファイルを操作するためのものでした。ワイルドカード*.txt
を使用して、複数のファイルを操作してみようと思いました。
私も他の間違いをしているかもしれません。いずれにせよ、複数のファイルの最初と最後にテキストを追加するにはどうすればよいですか?
テキストをファイルの先頭に追加するには、(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
すでに説明したように、sed
コマンドとi
コマンドをそれぞれ使用して、a
でファイルの行を一致させる直前と直後にテキスト行を挿入できます。表示されていないのは、ワンライナーでmultiple filesを一度に実行できることです。
次の例では、最初の1i
の前と最後の行$a
の後に行を挿入します。挿入は、グロブ*.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' \;
別の、より精巧な亜種-ソースファイルが結果に置き換えられました:
find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print
gnu awk
、inplace
拡張とBEGINFILE
/ENDFILE
を使用:
gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt
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
)救済のためのPerlワンライナー:
Perl -i -pe'$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof' *.txt