2016-08-19 8 views
0

ディレクトリ内のすべてのテキストファイルに対してawkコマンドを実行しています。今のところ、stdoutに表示されます。これらの変更を実際のファイル自体に保存したいと思います。私のコマンドは、私はそれが一つのファイルにすべてのものを保存し、コマンドをリダイレクトするたびにawkを使用してディレクトリからファイルをリダイレクトする

awk{ORS=(/^\- **\ **/?"":RS)}1 *.txt >> *.txt

です。とにかく、ファイル自体に変更を保存することはできますか?

+0

をので、あなたの更新GNU持つ入力ファイルを上書きする

4. *は次のようになりawkはタグを使用して、使用しているシェルを表示します。 '>>'は 'append'を意味します。それを意味しましたか、本当に '>'が '上書き 'を意味しますか?また、どのバージョンのawkを使用していますか?また、使用可能なGNU awk( 'awk --version')はありますか? –

答えて

0

- 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 
+0

forループは機能しましたが、各ファイルの空白行のスペースが削除され、各ファイルのデータが得られました。すべてを1行にまとめるように見えます。 – NickJ

+0

awkスクリプトはあなたが書いたことを行いますが、出力リダイレクトを追加してもそれはまったく変更されません。それが何かをしている場合は、それをしたくない1つのファイルをテストし、あなたがそれをやりたいことをするためにそれを修正します。例えば、それらを文字通り扱いたい場合は、 '*'をエスケープしたいでしょう。 –

関連する問題