ディレクトリ内のすべてのテキストファイルに対してawkコマンドを実行しています。今のところ、stdoutに表示されます。これらの変更を実際のファイル自体に保存したいと思います。私のコマンドは、私はそれが一つのファイルにすべてのものを保存し、コマンドをリダイレクトするたびにawkを使用してディレクトリからファイルをリダイレクトする
awk{ORS=(/^\- **\ **/?"":RS)}1 *.txt >> *.txt
です。とにかく、ファイル自体に変更を保存することはできますか?
ディレクトリ内のすべてのテキストファイルに対してawkコマンドを実行しています。今のところ、stdoutに表示されます。これらの変更を実際のファイル自体に保存したいと思います。私のコマンドは、私はそれが一つのファイルにすべてのものを保存し、コマンドをリダイレクトするたびにawkを使用してディレクトリからファイルをリダイレクトする
awk{ORS=(/^\- **\ **/?"":RS)}1 *.txt >> *.txt
です。とにかく、ファイル自体に変更を保存することはできますか?
-
sとブランクは、正規表現でエスケープする必要がないので、ブラケット式の外にあるregexpメタキャラクタではありません。あなたは一重引用符で区切ってスクリプトを囲む必要があります。これにより、あなたのスクリプトは明らかに何をしようとしているのでしょうか。
awk '{ORS=(/^- ** **/?"":RS)}1'
あなたが読んでいるファイルに書き込むことはできません。あなたは、任意のコマンドを使用していることをしようとする場合(awkを、セッド、grepの、何でも):
はcommand file > file
そして、シェルはそれがcommand file
前> file
を実行し、あなたのコマンドがそれを開く前にそのファイルを空にするなど、好きなものは何でも行うことができます。
awk -i inplace '{ORS=(/^- ** **/?"":RS)}1' *.txt
およびその他のawksであなたのような何か必要があると思います::これはシェルの問題です
for file in *.txt; do
awk '{ORS=(/^- ** **/?"":RS)}1' "$file" > tmp && mv tmp "$file"
done
forループは機能しましたが、各ファイルの空白行のスペースが削除され、各ファイルのデータが得られました。すべてを1行にまとめるように見えます。 – NickJ
awkスクリプトはあなたが書いたことを行いますが、出力リダイレクトを追加してもそれはまったく変更されません。それが何かをしている場合は、それをしたくない1つのファイルをテストし、あなたがそれをやりたいことをするためにそれを修正します。例えば、それらを文字通り扱いたい場合は、 '*'をエスケープしたいでしょう。 –
をので、あなたの更新GNU持つ入力ファイルを上書きする
4. *は次のようになりawkはタグを使用して、使用しているシェルを表示します。 '>>'は 'append'を意味します。それを意味しましたか、本当に '>'が '上書き 'を意味しますか?また、どのバージョンのawkを使用していますか?また、使用可能なGNU awk( 'awk --version')はありますか? –