удалить текст после регулярного выражения до конца строки

При использовании find... -exec... {} +{}должно быть последним перед +(, потому что findдобавляет имена путей в конец команды ). Однако ошибка возникает из-за отсутствия ;в конце первого find.

Нет смысла сначала находить все подкаталоги, а затем выполнять еще один поиск по ним, поэтому ваша команда findможет быть заменена однойfind:

find "./$1_"* -type f -name 'wood.dat'

Это будет искать файлы с именем wood.datво всех каталогах, соответствующих "./$1_"*.

Все присвоение будет

numWoodFiles=$( find "./$1_"* -type f -name 'wood.dat' | wc -l )

Я удалил внешний (...), так как нам не нужно создавать массив для одного целого числа.

1
08.04.2020, 15:03
5 ответов

Если всегда есть только один );, это довольно просто:

$ sed 's/);.*/);/' file 
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

если их может быть больше и вы хотите удалить все после последнего:

$ sed -E 's/(.*)\);.*/\1);/' file 
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

Ваш не работает, потому что вы пытаетесь сопоставить ), за которым следуют 4 числа (\)[0-9]{4}), но у вас нет этого во входных данных. Я думаю, вы пытались написать что-то вроде этого:

$ sed -E 's/(.*[0-9]{4}\);).*/\1/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
0
28.04.2021, 23:18

Правильный способ написать то, что вы хотите, это

sed -E 's/(.*[0-9]{4}\);).*/\1/' file

Это удалит все символы строки после последнего вхождения yyyy);каждой строки.

Ваша попытка была

sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file

Но из-за флага -E, который включает расширенное регулярное выражение, \( \)не разграничивают совпадающие группы, вместо этого они соответствуют литеральным скобкам из файла, а ( )разграничивают совпадающие группы. Таким образом, скобка в [0-9]{4})не имеет себе равных, и sed жалуется:

sed: -e expression #1, char 28: Unmatched ) or \)
3
28.04.2021, 23:18

Метод 1

sed 's/\(.*[0-9]\{4\});\)\(.*\)/\1/' filename

выход

  this is a year (2004);
    singer elton john; month and year (December, 2005);
    this another year (2007);

Метод 2

awk -F ");" '{print $1");"}' filename

выход

this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

Питон

#!/usr/bin/python
import re
k=re.compile(r'.*[0-9]\);')
p=open('o.txt','r')
for i in p:
    z=re.search(k,i)
    print z.group()

выход

this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
0
28.04.2021, 23:18

В вашем примере вы вырезаете каждую строку после последней ;. Это простая операция с sed, не требующая обратной ссылки :

.
$ sed 's/;[^;]*$/;/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

Или, сawk:

awk -F ';' 'BEGIN { OFS=FS } { $NF=""; print }' file
0
28.04.2021, 23:18

Сgrep(предполагается, что ваша версия поддерживает опцию -o)

$ grep -oE '.*[0-9]{4});' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);
Опция

-oзаставит grepпечатать только совпадающие части. Так,это не совсем то же самое, что и команда sed, так как строки, не содержащие этот шаблон, не будут напечатаны.

0
28.04.2021, 23:18

Теги

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