Как добавить строку после каждой строки в файле с помощью bash? Можно ли это сделать с помощью команды sed, если да, то как?
Как добавить строку после каждой строки в файле с помощью bash? Можно ли это сделать с помощью команды sed, если да, то как?
Ответы:
Если вы sedразрешаете редактирование на месте с помощью -iпараметра:
sed -e 's/$/string after each line/' -i filename
Если нет, вам нужно создать временный файл:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
sed -e 's/^/string after each line/' -i filename $ означает конец строки. ^ означает начало строки.
sed 's/^/string after each line/'делает то , что я ожидал (добавляется к каждой строке), но sed 's/^/string after each line/'не делает (он заменяет всю строку моей строкой добавления). Что дает? Есть идеи @TomDeGisi?
Я предпочитаю использовать awk. Если есть только один столбец, используйте $0, иначе замените его последним столбцом.
В одну сторону,
awk '{print $0, "string to append after each line"}' file > new_file
или это,
awk '$0=$0"string to append after each line"' file > new_file
NRпеременную:awk '{print $0, NR}'
sed 's/ //g'это сработало для моего требования, но оно удалит пробел в каждой строке, вот какой вариант gдля и везде в строке.
, лайк {print $0"string to append after each line"}.
Если он у вас есть, утилита lam (ламинат) может это сделать, например:
$ lam filename -s "string after each line"
Чистая оболочка POSIX и sponge:
suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargsи printf:
suffix=foobar
xargs -L 1 printf "%s${suffix}\n" < file | sponge file
Использование join:
suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
Инструменты Shell , используя paste, yes, head
и wc:
suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Обратите внимание, что перед этим pasteвставляется символ табуляции$suffix .
Конечно, spongeможно заменить временным файлом, а затем mvповерх исходного имени файла, как и некоторые другие ответы ...
sed, если ресурсы не очень ограничены.
sedне нужен для такой простой работы.
Я предпочитаю echo. используя чистый bash:
cat file | while read line; do echo ${line}$string; done
Сед немного уродлив, изящно это можно сделать так:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo; сделать echo $ {i} bar; done foobar barbar bazbar, но после некоторых тестов я могу ошибаться в своих рассуждениях, но Деннис прав
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)который печатает 2 строки, даже если ввод - 1 строка foo bar(и catчтение из стандартного ввода вместо файла не имеет значения для этого).
touchвременный файл? И я бы поставилsedкоманду в зависимость от успеха,cpиначе оригинал может быть утерян.