Exec и sed команды - PullRequest
       8

Exec и sed команды

0 голосов
/ 07 февраля 2019

Вопрос в том, как объединить следующие команды в одну строку и использовать exec.

find . -name '*.txt' -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;

Результат: путь и имя всех файлов .txt.

find . -name '*.txt' -exec sed -n '/stringA/,/stringB/p' {} \;

Результат: строки между начальным и конечным параметрами для всех файлов .txt.

Требуемый результат: укажите линии между начальным и конечным параметрами.Первая строка должна содержать путь и имя файла .txt.

find . -name '*.txt' -exec ???? {} \;

. / Alpha / file01.txt

stringA

line1

line2

stringB

. / Beta / file02.txt

stringA

line1

line2

строкаB

Спасибо.Т.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Использование GNU sed и realpath:

sed -sn '1F;/stringA/,/stringB/p' $(realpath *.txt)

Или, если допустимы относительные пути:

sed -sn '1F;/stringA/,/stringB/p' ./*.txt

Если код долженЗаписаться в подкаталоги:

sed -sn '1F;/stringA/,/stringB/p'  $(find . -name '*.txt')
0 голосов
/ 07 февраля 2019

Если файлы не пустые, то все, что вам нужно, это:

find . -name '*.txt' -exec awk 'FNR==1{print FILENAME} /StringA/,/StringB/' {} +

Если они могут быть пустыми, то самый простой способ справиться с этим - использовать GNU awk для BEGINFILE:

find . -name '*.txt' -exec awk 'BEGINFILE{print FILENAME} /StringA/,/StringB/' {} +
0 голосов
/ 07 февраля 2019

Может быть проще передать вывод find другим командам, чем использовать -exec.Попробуйте следующее:

find . -type f -name '*.txt' -print0 | while read -r -d "" f; do echo "$f"; sed -n "/stringA/,/stringB/p" "$f"; done

, что дает:

./alpha/file01.txt
stringA
line1
line2
stringB
./beta/file02.txt
stringA
line1
line2
stringB
  • -print0 опция в find объединяет имена файлов, разделенные нулевым символом.
  • Затем мы можем ссылаться на $f как имя файла в цикле while.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...