Я считаю, что это должно; Я тестировал только на Linux, используя версию GNU.
unxnut
11
@AvinashRaj. Это POSIX, и он работал с оригинальной sedкомандой в Unix v7 в 1979 году. Единственное место, где это может не сработать, - это sedупрощенные реализации без POSIX, подобные некоторым упрощенным реализациям на основе busybox. Это не сработает в csh, но это проблема csh.
Стефан Шазелас
Так \\nкак используется в поисковой части, почему бы не использовать \nв замене? первое, кажется, подразумевает, что второе существует. то есть. почему не это$ echo '1\n2'|sed 's/\\n/\n/g'
В данном случае, \nэто литерал, означающий, что он отображается в виде двух символов: за ним следует abackslash n, а не как один символ новой строки. Следовательно, два обратных слеша для того, чтобы сделать обратный слэш буквальным, а затемn
unxnut
9
Поскольку у вас уже есть переносимый sedответ, я просто упомяну, что sedон редко является лучшим инструментом, если вам нужно каким-то образом манипулировать символами новой строки. Perl почти так же переносим, как sedи установлен по умолчанию на большинстве систем * nix и может очень легко справиться с этим:
В Solaris не забудьте использовать стандартный awk в / usr / xpg4 / bin, тот, что в / bin, является историческим и не должен использоваться для новых сценариев.
Я бы сказал , что awkимеет аналогичные проблемы с переносимостью (Это мой awkстарый добрый awk, nawkили gawk?). На самом деле, версия в моих коробках Solaris не хватает gsub(). Мой голос здесь за Perl ( perl -nlawe '...'приближается к автоматическому поведению awk).
arielCo
2
@arielCo: Для awkмобильности, придерживайтесь версии, awkкоторая совместима с POSIX, и используйте только эти функции, и все будет в порядке. На Солярисе вы найдете один как /usr/xpg4/bin/awk.
@arielCo на самом деле, awk более переносим, чем perl. Мой второй подход awk, который не использует, gsub()должен работать почти везде. Даже busybox имеет awk.
тердон
1
gsub () - это POSIX (gsub, был добавлен в SVR3.1, POSIX awk основан на SVR4 с несколькими дополнениями, см. руководство gawk для получения дополнительной информации), gensub () - расширение GNU. Оригинальный awk все еще находился в Solaris как / bin / awk, не поддерживал 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слэши в стиле C - такие как пробел, \rэтанол, \00восьмерик и прочее.
foo\\nbar
илиfoo\\\nbar
?Ответы:
Обратите внимание на обратную косую черту непосредственно перед нажатием return в строке замены.
источник
sed
командой в Unix v7 в 1979 году. Единственное место, где это может не сработать, - этоsed
упрощенные реализации без POSIX, подобные некоторым упрощенным реализациям на основе busybox. Это не сработает в csh, но это проблема csh.\\n
как используется в поисковой части, почему бы не использовать\n
в замене? первое, кажется, подразумевает, что второе существует. то есть. почему не это$ echo '1\n2'|sed 's/\\n/\n/g'
\n
это литерал, означающий, что он отображается в виде двух символов: за ним следует abackslashn
, а не как один символ новой строки. Следовательно, два обратных слеша для того, чтобы сделать обратный слэш буквальным, а затемn
Поскольку у вас уже есть переносимый
sed
ответ, я просто упомяну, чтоsed
он редко является лучшим инструментом, если вам нужно каким-то образом манипулировать символами новой строки. Perl почти так же переносим, какsed
и установлен по умолчанию на большинстве систем * nix и может очень легко справиться с этим:Другой очень портативный выбор
awk
:В Solaris не забудьте использовать стандартный awk в / usr / xpg4 / bin, тот, что в / bin, является историческим и не должен использоваться для новых сценариев.
источник
awk
имеет аналогичные проблемы с переносимостью (Это мойawk
старый добрыйawk
,nawk
илиgawk
?). На самом деле, версия в моих коробках Solaris не хватаетgsub()
. Мой голос здесь за Perl (perl -nlawe '...'
приближается к автоматическому поведениюawk
).awk
мобильности, придерживайтесь версии,awk
которая совместима с POSIX, и используйте только эти функции, и все будет в порядке. На Солярисе вы найдете один как/usr/xpg4/bin/awk
.echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?gsub()
должен работать почти везде. Даже busybox имеетawk
.Если
H
oldspace пусто, вы также можете сделать:... но ответ uxnut уже быстрее и проще, так что вы можете принять его как хотите.
Еще одна посторонняя возможность:
Но будьте осторожны, ^ который переводит все стандартные
\
обратные\b
слэши в стиле C - такие как пробел,\r
этанол,\00
восьмерик и прочее.источник
Со
gnu sed
следующим также работает:источник
Вам нужно решение в sed, и это уже дано ниже. Но я хотел добавить еще одну возможность, что ИМХО проще и быстрее,
источник