Выбрать строки, начинающиеся с шаблона в предварительно выбранном тексте между двумя разными шаблонами

find +bashраствор:

find. -type f -name "*.pdf" -exec bash -c \
'p="/my_dir/backup/"; bn=${1##*/}; 
 [[ "$1" != $p* ]] && [[ -f "${p}$bn" ]] && cp "${p}$bn" "$1"' _ {} \;

  • p="/my_dir/backup/"-путь к начальному (ключевому )каталогу
  • bn=${1##*/}-базовое имя файла
0
20.02.2020, 12:38
1 ответ

Достаточно небольшой корректировки первой sedоперации:

sed -n '/PAT1/,/PAT2/{/^x [[:digit:]]*/p;}' file.txt > newfile.txt
  • Вероятно, нет необходимости пытаться исключить PAT1и PAT2, если только они не встречаются в той же строке, что и ^x [0-9]. В этом случае:
sed -n '/PAT1/,/PAT2/{/PAT1\|PAT2/!{/^x [0-9]*/p;};}' file.txt

также исключает PAT1иPAT2


Причина, по которой следующее ничего не делает:

sed -e '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' ; '/^x [[:digit:]]*/p'
                                            ^

заключается в том, что первая команда(sed)не получила никакого ввода из файла, поэтому ожидает ввода от standard input, то есть с вашей клавиатуры.

Точка с запятой не заключена в кавычки и является частью синтаксиса оболочки для интерпретации введенных вами команд. Проще говоря, строка выше означает:execute a command named 'sed', then execute a command named '/^x [[:digit:]]*/p'— что не имеет смысла.

2
28.04.2021, 23:22

Теги

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