如何从所有文件的字符串中删除其余文件?

如何从所有文件的字符串中删除其余文件?

如何从所有文件的字符串中删除其余文件?

例如,输入文件12,字符串是ddd

输入文件1

aaa
bbb
ccc
ddfbbd dddaaa
eee

输出文件1

aaa
bbb
ccc
ddfbbd 

输入文件2

ccc
aergddd
dasdvsdb

输出文件2

ccc
aerg

答案1

使用 GNU sed:

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

这需要循环进行:否则q命令将在仅处理第一个文件后中止整个过程。

答案2

使用 Perl:

perl -i -0777 -pe 's/ddd[\s\S]*//' file

或者

perl -i -0777 -pe 's/ddd.*//s' file
  • -i:就地修改文件。

  • -0777:强制 Perl 读取整个文件,而不是逐行读取。

  • -pe

    • -p:循环 Perl 代码。
    • -e:执行 Perl 代码。
  • 's/ddd[\s\S]*//':将后面的所有内容(包括它)替换为空字符串\s\Sddd

  • 's/ddd.*//s'.*:将后面的所有内容ddd(包括它)替换为空字符串。s末尾的标志.*也匹配换行符(感谢@glennjackman)。

有关 Perl 标志的更多信息,请参见这里

答案3

使用 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]

相关内容