web-dev-qa-db-ja.com

すべてのファイルの文字列から残りのファイルを削除するにはどうすればよいですか?

すべてのファイルの文字列から残りのファイルを削除するにはどうすればよいですか?

たとえば、入力ファイル1および2、文字列はdddです。

入力ファイル 1

aaa
bbb
ccc
ddfbbd dddaaa
eee

出力ファイル1

aaa
bbb
ccc
ddfbbd 

入力ファイル 2

ccc
aergddd
dasdvsdb

出力ファイル2

ccc
aerg
9
genderbee

GNU sed:

str="ddd"
for file in 1 2; do
    sed -i "/$str/ {s/$str.*//; q}" "$file"
done

これはループ内にある必要があります。そうしないと、qコマンドは最初のファイルのみを処理した後でプロセス全体を中止します。

11
glenn jackman

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フラグの詳細については、 ここ を参照してください。

7
user3140225

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]
4
αғsнιη