Как удалить остаток файла из строки для всех файлов?
Например, входные файлы 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
: Perl силы для прихлебывания файла как целого, не линию за линией.
-pe
:
-p
: код Perl цикла. -e
: выполните код Perl. 's/ddd[\s\S]*//'
: замените все (каждый пробел (\s
) и непробельный символ (\S
)) после ddd
(включая его) с пустой строкой.
's/ddd.*//s'
: замените все (.*
) после ddd
(включая его) с пустой строкой. Эти s
флаг в конце делает .*
также новые строки соответствия (благодарит @glennjackman).
с 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]