При использовании 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 )
Я удалил внешний (...)
, так как нам не нужно создавать массив для одного целого числа.
Если всегда есть только один );
, это довольно просто:
$ 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);
Правильный способ написать то, что вы хотите, это
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 \)
Метод 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);
В вашем примере вы вырезаете каждую строку после последней ;
. Это простая операция с 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
С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
, так как строки, не содержащие этот шаблон, не будут напечатаны.