1

Какой самый короткий код, который делает это? Я делал что-то вроде

echo "header" >  tmpfile
cat $file     >> tmpfile
echo "footer" >> tmpfile
mv tmpfile $file

, Есть ли более компактный способ?

4 ответа4

3
sed -i -e '1s/^/header\n/' -e '$s/$/\nfooter/' $file

Обновление: еще короче:

sed -i '1s/^/header\n/;$s/$/\nfooter/' $file

Обновление: и даже короче (но должно быть во многих строках, поскольку команды 'i' и 'a' в 'sed' должны сопровождаться \<newline>):

sed -i '1i\
header
;$a\
footer' $file
2

Ну, вы могли бы использовать здесь документ

tee > /tmp/otherfile <<EOF
header
$(cat $file)
footer
EOF

А потом переименуй.

2
{
echo "header"
cat $file
echo "footer"
} > tmpfile
mv tmpfile $file
0

Это похоже на работу в zsh , но, к сожалению, не в bash .

TMPTXT="header\n"$(cat $file)"\nfooter"
echo $TMPTXT > $file

или в одну строку:

echo header\\n"$(cat $file)"\\nfooter > $file

(Я думаю, что это должно работать и в bash , за исключением того, что у меня есть некоторые проблемы с правильным переводом строк).

РЕДАКТИРОВАТЬ:

Используя echo -e, это также работает в bash в одну строку:

echo -e "header\n$(cat $file)\nfooter"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .