Объединение эха и кота в Unix

Действительно простой вопрос, как мне объединить эхо и кошку в оболочке, я пытаюсь записать содержимое файла в другой файл с добавленной строкой?

Если /tmp/file выглядит так:

this is a test

Я хочу запустить это:

echo "PREPENDED STRING"
cat /tmp/file | sed 's/test/test2/g' > /tmp/result 

так что /tmp/result выглядит так:

PREPENDED STRINGthis is a test2

Спасибо.


person Dan    schedule 09.06.2010    source источник


Ответы (6)


Это должно работать:

echo "PREPENDED STRING" | cat - /tmp/file | sed 's/test/test2/g' > /tmp/result 
person Douglas    schedule 09.06.2010
comment
Мне нравится эта простота, но для полноты следует иметь флаг -n для эха, как указано в другом ответе. - person Dan; 09.06.2010
comment
Для всех, кто интересуется - в аргументах cat, из справочных страниц: With no FILE, or when FILE is -, read standard input. - person SooDesuNe; 13.01.2012
comment
Флаг -n работает не со всеми вариантами echo, но в основном это историческая справка. - person reinierpost; 26.04.2013
comment
Я всегда использовал { echo "PREPENDED STRING"; cat /tmp/file; } |, но это намного элегантнее, спасибо! - person reinierpost; 26.04.2013
comment
Где флаг -n в эхе необходим для подавления завершающей новой строки. - person hertzsprung; 13.02.2019
comment
Обратите внимание, что -n должен стоять перед строкой: echo -n "mystring" | cat - astrophy - person Juha Untinen; 03.04.2019

Пытаться:

(printf "%s" "PREPENDED STRING"; sed 's/test/test2/g' /tmp/file) >/tmp/result

Скобки запускают команды внутри подоболочки, так что вывод выглядит как один поток для перенаправления >/tmp/result.

person Greg Hewgill    schedule 09.06.2010

Или просто используйте только sed

  sed -e 's/test/test2/g
s/^/PREPEND STRING/' /tmp/file > /tmp/result
person Iacopo    schedule 09.06.2010
comment
для однострочного использования используйте 2 -e: sed -e 's/test/test2/g' -e 's/^/PREPEND STRING/' ... - person glenn jackman; 09.06.2010
comment
Это, конечно, будет добавлять строку к каждой строке входного файла. - person glenn jackman; 09.06.2010
comment
Что может быть тем, что нужно. Если нет: sed '1s/^/PREPENDED STRING/; s/test/test2/g' /tmp/file > /tmp/result - person Dennis Williamson; 09.06.2010

Или также:

{ echo "PREPENDED STRING" ; cat /tmp/file | sed 's/test/test2/g' } > /tmp/result
person mathk    schedule 09.06.2010
comment
Бесполезное использование cat, например. это также сработает: { echo "PREPENDED STRING" ; sed 's/test/test2/g'; } < /tmp/file > /tmp/result - person reinierpost; 26.04.2013

Если это когда-либо для отправки электронной почты, не забудьте использовать окончания строк CRLF, например:

echo -e 'To: [email protected]\r' | cat - body-of-message \
| sed 's/test/test2/g' | sendmail -t

Обратите внимание на флаг -e и \r внутри строки.

Настройка To: этот способ в цикле дает вам самую простую в мире программу массовой рассылки.

person kaleissin    schedule 26.04.2013

Другой вариант: предполагая, что предваряемая строка должна появляться только один раз, а не для каждой строки:

gawk 'BEGIN {printf("%s","PREPEND STRING")} {gsub(/test/, "&2")} 1' in > out
person glenn jackman    schedule 09.06.2010