Как заставить sed принимать входные данные из pipe и вставлять их в файл - PullRequest
2 голосов
/ 20 сентября 2019

возможно ли использовать канал, чтобы перенаправить вывод предыдущей команды в sed, и позволить sed использовать это как ввод (шаблон или строку) для доступа к файлу?

Я знаю, если вы толькоиспользуйте sed, вы можете использовать что-то вроде

sed -i '1 i\anything' file

Но могу ли я сделать что-то вроде

head -1 file1 | sed -i '1 i\OutputFromPreviousCmd' file2

Таким образом, мне не нужно вручную копировать вывод и изменять команду sedEverytime

Обновление: добавлены файлы, которые я имел в виду

head -3 file1.txt
Side A,Age(us),mm:ss.ms_us_ns_ps
 84 Vendor Specific, 0000000009096, 0349588242
 84 Vendor Specific, 0000000011691, 0349591828

head -3 file2.txt
 84 Vendor Specific, 0000000000418, 0349575322
 83 Vendor Specific, 0000000002099, 0349575343
 83 Vendor Specific, 0000000001628, 0349576662

Я бы хотел взять первую строку file1 и вставить ее в file2, поэтому результат должен быть:

head -3 file2.txt
 Side A,Age(us),mm:ss.ms_us_ns_ps
 84 Vendor Specific, 0000000000418, 0349575322
 83 Vendor Specific, 0000000002099, 0349575343
 83 Vendor Specific, 0000000001628, 0349576662

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

head -1 file1 | sed '1s/^/1i /' | sed -i -f- file2

Это займет одну строку вывода, добавит команду sed 1i, каналы, которые передают поток команды sed в sed, используя -f- для получения команд sed из стандартного ввода.

Например:

$ echo bob > bob.txt
$ echo alice | sed '1s/^/1i /' | sed -i -f- bob.txt
$ more bob.txt
alice
bob

Это похоже на каналы, а не команды, оканчивающиеся на > temp ; mv temp file2, но тем не менее sed делает это, когда используется -i.

0 голосов
/ 22 сентября 2019

Это может работать для вас (GNU sed):

head -1 file1 | sed -i '1e cat /dev/stdin' file2

Вставить первую строку файла1 в начало файла2.

Но почему бы не использовать cat?:

cat <(head -1 file1) file2
...