![如何从所有文件的字符串中删除其余文件?](https://linux22.com/image/916305/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E5%88%A0%E9%99%A4%E5%85%B6%E4%BD%99%E6%96%87%E4%BB%B6%EF%BC%9F.png)
如何从所有文件的字符串中删除其余文件?
例如,输入文件1
和2
,字符串是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
。\S
ddd
'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]