добавить имя файла в начало файла, используя find и sed - PullRequest
7 голосов
/ 18 октября 2011

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

ls | while read file; do sed -e "s/^/$file/g" $file > out; done

Я хочу выполнить такую ​​же замену sed, но с использованием команд find и exec или xargs -

find . -type f -exec sed "s/^/{}/g" {} > out +

но я получаю ошибку -

find: только один экземпляр {} поддерживается с -exec ... +

Входные файлы выглядят так -

fileA.txt

A1
A2

fileB.txt

B1
B2

желаемый вывод

fileA.txt A1
fileA.txt A2
fileB.txt B1
fileB.txt B2

Я знаю, как сделать это с помощью awk, но я бы хотел сделать это с помощью sed, find и exec или xargs.

Ответы [ 4 ]

5 голосов
/ 19 октября 2011
 find . -type f |xargs awk '$0=FILENAME$0' > out

когда я ответил на это, ваша строка "no awk" еще не там.в любом случае, посмотрите мой обновленный ответ ниже:

обновлено на основе комментария

, поэтому вы хотите использовать find, exec / xargs и sed для этого.Мой сценарий нуждается в GNU Sed , я надеюсь, что он у вас есть.

сначала посмотрите один слой: (ну, > out опущен. Вы можете добавить его в конец строки.)

find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed  "s:^:file \2 :g"#ge'

Теперь давайте пройдем тест, см. Ниже:

kent$  head *.txt
==> a.txt <==
A1
A2

==> b.txt <==
B1
B2

kent$  find . -type f | xargs -i echo {}|sed -r 's#(.\/)(.*)#cat &\|sed  "s:^:file \2 :g"#ge'
file b.txt B1
file b.txt B2
file a.txt A1
file a.txt A2

- это результат, который вы ожидаете?

Краткое объяснение

  • find ....|xargs -i echo {} Ничего не объяснимо, просто напечатайте имя файла в строке (с ведущим "./")
  • затемпередайте имя файла в строку sed, например sed -r 's#(.\/)(.*)# MAGIC #ge'
  • , помните, что в приведенной выше строке у нас есть две группы \1: "./" и \2 "a.txt"(filename)
  • , так как у нас есть e в концеиз строки sed, часть MAGIC будет выполнена как команда оболочки (требуется GNU sed)
  • MAGIC : cat &\|sed "s:^:file \2 :g cat & просто выводит содержимое файлаи трубка к другому седу.сделайте замену (s:..:..:g)
  • и, наконец, результатом выполнения MAGIC будет замена внешнего sed.

ключом является 'e' Gnu sed.

5 голосов
/ 18 октября 2011

не проверено, попробуйте использовать xargs

find . -type f | xargs -I FILE sed "s/^/FILE/g" FILE > out
1 голос
/ 19 октября 2011

Почему бы вам просто не заменить ls в первой строке на find, как это?

find . -type f | while read file; do sed -e "s|^|$file|" $file > out; done

Вы должны только заменить разделитель на s с / на что-то другое, не указанное в ваших именах файлов. Я выбрал | в качестве примера.

0 голосов
/ 18 октября 2011

Как насчет:

find . -type f | xargs -i echo FILE/{} > out
...