Как я могу удалить остаток файла из строки для всех файлов?

Как удалить остаток файла из строки для всех файлов?

Например, входные файлы 1 и 2, строка ddd.

Входной файл 1.

aaa
bbb
ccc
ddfbbd dddaaa
eee

Выходной файл 1.

aaa
bbb
ccc
ddfbbd 

Входной файл 2.

ccc
aergddd
dasdvsdb

Выходной файл 2.

ccc
aerg
9
задан 1 October 2019 в 18:06

3 ответа

С GNU sed:

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

Это должно быть в цикле: иначе эти q команда прервала бы целый процесс после обработки только первого файла.

11
ответ дан 23 October 2019 в 09:52

С 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).

[еще 1131] о флагах Perl может быть найден здесь .

7
ответ дан 23 October 2019 в 09:52

с 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
ответ дан 23 October 2019 в 09:52

Другие вопросы по тегам:

Похожие вопросы: