Як додати рядок після кожного рядка у файлі за допомогою 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 filexargsі 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може бути втрачена, або оригінал може бути втрачений