2016-10-06 2 views
0

より良い管理システムに切り替えるので、各ソースファイルの上部にあるすべての冗長ログを削除したいと思っています。メモ帳++では、 "ファイルを置き換える"と一致するものを\A(//.*\n)+に置き換えて空白にすると、結果を得ることができました。しかしLinuxでは、私はそのような運がないので、「xargs」と「sed」に頼る必要があります。sedを使用するときにxargsのputをリダイレクトする方法

私が使用しているsedの式は次のとおりです。

確かに醜い

sed '1,/^[^\/]/{/^[^\/]/b; d}'

動作するようには思えません。

私が抱えている問題は、システムですべてのソースファイルをフィードするために 'xargs'を使って実行しようとするときです。出力を '取り除かれた'ファイルにリダイレクトできません。オリジナルをコピーする。

私はラインで何かしたい:私はすでにあまりにも多くの引用符を使用していて、私は受信環境(シェル)に至るまで、「>」を渡して悲しみを抱えているが

find . -name "*.com" -type f -print0 | xargs -0 -I file sed '1,/^[^\/]/{/^[^\/]/b; d}' "file" > "file.stripped"

を。私はエスケープとシェル "ラッパー"のすべての方法を試してみましたが、私はボールをプレイすることができません。

誰かが正しい方向に向けるように気をつけてください。

ありがとう、 Slarti。

+0

あなたのsed実装では、 '-i'オプションをサポートしていますか? – choroba

+0

はい、そうです。それは人生を楽にします。私はそれを行ってあなたに戻ってきます;) – Slartibartfast

+0

なぜあなたはfindで-execオプションを使うべきですか?これと似た何か、 'find。 -name "* .com" -type f -print0 -exec sed '1、/^[^ \ /]/{/^[^ \ /]/b; d} '{}> "file.stripped" \; ' –

答えて

0

私はそれはあなたのために働くかどうかを確認し、単なる一例として、単純なsedの式で同様のシナリオを作った:

私はそれぞれの中の文字列「ABCD」と3つのファイルを作成:

# ls -l 
total 12 
-rw-r--r-- 1 root root 5 Oct 6 09:05 test.aaaaa.com 
-rw-r--r-- 1 root root 5 Oct 6 09:05 test2.aaaaa.com 
-rw-r--r-- 1 root root 5 Oct 6 09:05 test3.aaaaa.com 
# cat test* 
abcd 
abcd 
abcd 

をxargsの代わりに-execオプションを使って示したようにfindコマンドを実行し、sed式を単に "b"のすべての "a"とオプション-iを置き換える愚かなものに置き換えると、入力ファイルが直接書き込まれます。

# find . -name "*.com" -type f -print0 -exec sed -i 's/a/b/g' {} \; 
./test2.aaaaa.com./test3.aaaaa.com./test.aaaaa.com 
# cat test* 
bbcd 
bbcd 
bbcd 

あなたのケースでは、それは次のようになります。

# find . -name "*.com" -type f -print0 -exec sed -i '1,/^[^\/]/{/^[^\/]/b; d}' {} \; 
+0

ありがとうございます。それは確かに完璧に働いています。しかし完全性から、どれがどのように出力をリダイレクトするか考えていますか? – Slartibartfast

+0

xargs -Iオプションを使用してこれを達成することはできません。なぜなら、出力のリダイレクトに使用される ">"記号の後にコマンド引数の一部ではないことを理解しているからです。実際のファイル名に "stripped"を指定すると、 "find"はリテラル "file.stripped"ファイルを作成します。 "for"コマンドを使用して "find"と "xargs"でも、それを行うには最もスマートで、簡単な方法ではありません。 また、私の答えをupvoteすることを忘れないでください。;) 乾杯! – AFAbyss

関連する問題