Замініть \ n новим рядком на sed портативно


23

Я настільки переплутана з безліччю варіантів GNU sed, POSIX sedта BSD sed. Як замінити буквальний \nсимвол символом нової лінії за допомогою цих трьох sedтипів?


У них багато різних речей, яку частину ви хочете знати?
cuonglm

@Gnouc Я думаю, зараз це зрозуміло.
Авінаш Радж

1
Ви подивились на це питання ?
groxxda

2
Що ви хочете , щоб сталося на вході , як foo\\nbarі foo\\\nbar?
Жил "ТАК - перестань бути злим"

просто, foo \\ у наступному рядку це буде бар.
Avinash Raj

Відповіді:


30
sed 's/\\n/\
/g'

Помітьте зворотну косу рису прямо перед натисканням клавіші return у рядку заміни.


це працює для всіх видів sed?
Авінаш Радж

Я вважаю, що це повинно; Я протестував лише на Linux, використовуючи версію gnu.
unxnut

11
@AvinashRaj. Це POSIX і працював з оригінальною sedкомандою в Unix v7 в 1979 році. Єдиним місцем, де це може не працювати, були б нереалізовані на реалізацію POSIX-версії, sedподібні до деяких зведених на основі зайнятих наборів. Це не працюватиме в csh, але це проблема csh.
Стефан Шазелас

Оскільки \\nвикористовується в пошуковій частині, чому б не використати \nзаміну? перший, здається, означає, що останній існує. тобто. чому б це не так$ echo '1\n2'|sed 's/\\n/\n/g'

У цьому випадку \nце буквальне значення, маючи на увазі, що він відображається як два символи: зворотний проріз, за ​​яким слідує n, а не як один символ нового рядка. Значить, два нахили для того, щоб зробити зворотний n
нахил

9

Оскільки у вас вже є ваша портативна sedвідповідь, я лише зазначу, що sedрідко є найкращим інструментом, якщо вам потрібно якось маніпулювати новими рядками. Perl майже майже такий же портативнийsed встановлено за замовчуванням у більшості * nix систем, і з цим можна легко впоратися:

printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'

Ще один дуже портативний вибір awk :

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\\\n","\n")};1'

У Solaris не забудьте використовувати стандартний awk в / usr / xpg4 / bin, той в / bin є історичним і не повинен використовуватися для нових сценаріїв.


Я б сказав, що awkє подібні проблеми з переносністю (чи є мій awkзвичайний старий awk, nawkчи gawk?). Насправді версії в моїх скриньках Solaris бракує gsub(). Мій голос тут за "Perl" ( perl -nlawe '...'приблизний до автоматичної поведінки awk).
arielCo

2
@arielCo: Для awkпортативності слід дотримуватися версії awk, сумісної з POSIX, і користуватися лише тими функціями, і вам слід добре. На Solaris ви знайдете як /usr/xpg4/bin/awk.
Scrutinizer

@terdon як щодо цього echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'?
Avinash Raj

@arielCo насправді, awk більш портативний, ніж perl. Мій другий підхід awk, який не використовується, gsub()повинен працювати майже всюди. Навіть зайнятий ящик має awk.
terdon

1
gsub () - POSIX (gsub, доданий у SVR3.1, POSIX awk заснований на SVR4 з кількома доповненнями. Додаткову інформацію див. у посібнику з gawk), gensub () - розширення GNU. Оригінальний awk все ще знайдений як / bin / awk на Solaris, не підтримував підтримку gsub (), але також не підтримував багато символів FS.
Стефан Шазелас

1

Якщо Holdspace порожній, ви також можете зробити:

sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'

... але відповідь uxnut вже є і швидшою, і простішою, тому ви можете прийняти її як завгодно.

Ще одна можливість:

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

Але будьте обережні, ^ що перекладає всі стандартні ухили від \зворотної косої \bлінії в стилі С - як, наприклад, пробіл, етурн та \rвісімки та що \00таке.



-2

Вам потрібен розчин у sed, і це вже наведено нижче. Але я хотів додати ще одну можливість, що IMHO просто простіше і швидше,

tr -d "\n"

1
що це робить? видалити всі нові рядки з введення?
mikeserv

Так, саме це і робиться
jpmuc

5
але чому? що це взагалі пов'язане з питанням?
mikeserv

1
Це просто видаляє "\ n", коли питання запитує, як замінити рядок "\ n" фактичними новими рядками.
спудер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.