すべてのファイルの文字列から残りのファイルを削除するにはどうすればよいですか?
たとえば、入力ファイル1
および2
、文字列はddd
です。
入力ファイル 1
。
aaa
bbb
ccc
ddfbbd dddaaa
eee
出力ファイル1
。
aaa
bbb
ccc
ddfbbd
入力ファイル 2
。
ccc
aergddd
dasdvsdb
出力ファイル2
。
ccc
aerg
GNU sed:
str="ddd"
for file in 1 2; do
sed -i "/$str/ {s/$str.*//; q}" "$file"
done
これはループ内にある必要があります。そうしないと、q
コマンドは最初のファイルのみを処理した後でプロセス全体を中止します。
Perlの場合:
Perl -i -0777 -pe 's/ddd[\s\S]*//' file
または
Perl -i -0777 -pe 's/ddd.*//s' file
-i
:ファイルを適切に変更します。
-0777
:行単位ではなく、ファイル全体を強制的に削除します。
-pe
:
-p
:Perlコードをループします。-e
:Perlコードを実行します。's/ddd[\s\S]*//'
:すべてを置き換えます(すべての空白(\s
)および非空白文字(\S
)文字)ddd
の後(それを含む)、空の文字列。
's/ddd.*//s'
:すべてを置き換えます(.*
)ddd
(これを含む)の後に空の文字列を指定した後。最後のs
フラグは.*
は改行にも一致します(@glennjackmanに感謝)。
Perlフラグの詳細については、 ここ を参照してください。
GNU awk
を使用すると、次のことができます。
awk 'function output(){ print >>FILENAME".out" }
/ddd/{ sub(/ddd.*/,""); output(); nextfile }
{ output() }' file[12]
インプレースで変更することで、コマンドがさらに簡単になります。
gawk -i inplace '/ddd/{ sub(/ddd.*/,""); print ; nextfile }1' file[12]