Как заменить символы новой строки символами табуляции?
Вопрос
У меня есть шаблон, как показано ниже
hi
hello
hallo
greetings
salutations
no more hello for you
Я пытаюсь заменить все новые строки на вкладке с помощью следующей команды
sed -e "s_/\n_/\t_g"
но это не работает.
Кто-нибудь может помочь? Я ищу решение в sed / awk.
Решение
не уверен, какой вывод вы хотите
# awk -vRS="\n" -vORS="\t" '1' file
hi hello hallo greetings salutations no more hello for you
Другие советы
Здесь tr
лучше, я думаю:
tr "\n" "\t" < newlines
Как предложил Nifle в комментарии, newlines
здесь - это имя файла, содержащего оригинальный текст.
Поскольку sed
очень ориентирован на строки, использовать его в таком случае сложнее.
sed '$!{:a;N;s/\n/\t/;ta}' file
Строки не могут быть заменены построчно на sed
. Вы должны накапливать строки и заменять символы между ими.
text abc\n <- can't replace this one
text abc\ntext def\n <- you can replace the one after "abc" but not the one at the end
Этот скрипт sed
собирает все строки и удаляет все новые строки, кроме последнего:
sed -n '1{x;d};${H;x;s/\n/\t/g;p};{H}'
Кстати, ваш sed
скрипт sed -e " s _ / \ n _ / \ t_g "
пытается сказать "заменить все слэши, за которыми следуют символы новой строки, косые черты с последующими вкладками " ;. Подчеркивания играют роль разделителей для команды s
, так что косые черты можно легче использовать в качестве символов для поиска и замены.
paste -s
-s Объединить все строки каждого отдельного входного файла в порядок командной строки. Символ новой строки каждой строки кроме последней строки в каждом входном файле заменяется символ табуляции, если не указано иное параметром -d.
Вы уже почти со своим сценарием sed, вам просто нужно изменить его на:
sed -e "s/\n/\t/g"
\
достаточно для выхода, вам не нужно добавлять _
И вам нужно добавить /
перед g
в конце, чтобы sed знал, что это последняя часть скрипта.