如何从所有文件的字符串中删除其余文件?
例如,输入文件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]