В Bash, как добавить строку после каждой строки в файле?

Как добавить строку после каждой строки в файле с помощью bash? Можно ли это сделать с помощью команды sed, если да, то как?

Ответ 1

Если ваш 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

Ответ 2

Я предпочитаю использовать 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

Ответ 3

Если у вас есть это, утилита lam (ламинат) может сделать это, например:

$ lam filename -s "string after each line"

Ответ 4

  1. Чистая оболочка и sponge POSIX:

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
    
  2. xargs и printf:

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
    
  3. Используя join:

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
    
  4. Инструменты оболочки, используя paste, yes, head и wc:

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
    

    Обратите внимание, что paste вставляет символ табуляции перед $suffix.

Конечно, sponge может быть заменена временным файлом, после чего mv 'd поверх исходного имени файла, как с некоторыми другими ответами...

Ответ 5

Sed немного уродлива, вы можете сделать это элегантно, как это:

[email protected] tmp$ cat foo 
bar
candy
car
[email protected] tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar