Як додати рядок після кожного рядка у файлі за допомогою 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
вставляє Tab символ перед тим $suffix
.
Звичайно, sponge
можна замінити тимчасовий файл, після чого mv
над початковим іменем файлу, як і деякі інші відповіді ...
sed
, якщо тільки ресурси дуже обмежені.
sed
не потрібна для такої простої роботи.
Я віддаю перевагу echo
. використовуючи чистий bash:
cat file | while read line; do echo ${line}$string; done
Sed трохи некрасивий, ви можете зробити це так елегантно:
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
; do echo $ {i} бар; зробив foobar barbar bazbar, але після деяких тестів я можу помилитися з приводу своїх міркувань, але Денніс має рацію
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
які друкують 2 рядки, навіть якщо вхід становить 1 рядок foo bar
(і cat
читання з stdin замість файлу для цього не має ніякої різниці).
touch
тимчасовий файл? І я зробив биsed
умовою, що командаcp
може бути втрачена, або оригінал може бути втрачений