Я так запутался с множеством опций GNU sed
, POSIX sed
и BSD sed
. Как заменить литерал \n
символом новой строки, используя эти три sed
типа?
foo\\nbar
или foo\\\nbar
?
Я так запутался с множеством опций GNU sed
, POSIX sed
и BSD sed
. Как заменить литерал \n
символом новой строки, используя эти три sed
типа?
foo\\nbar
или foo\\\nbar
?
Ответы:
sed 's/\\n/\
/g'
Обратите внимание на обратную косую черту непосредственно перед нажатием return в строке замены.
sed
командой в Unix v7 в 1979 году. Единственное место, где это может не сработать, - это sed
упрощенные реализации без POSIX, подобные некоторым упрощенным реализациям на основе busybox. Это не сработает в csh, но это проблема csh.
\\n
как используется в поисковой части, почему бы не использовать \n
в замене? первое, кажется, подразумевает, что второе существует. то есть. почему не это$ echo '1\n2'|sed 's/\\n/\n/g'
\n
это литерал, означающий, что он отображается в виде двух символов: за ним следует abackslash n
, а не как один символ новой строки. Следовательно, два обратных слеша для того, чтобы сделать обратный слэш буквальным, а затемn
Поскольку у вас уже есть переносимый 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
).
awk
мобильности, придерживайтесь версии, awk
которая совместима с POSIX, и используйте только эти функции, и все будет в порядке. На Солярисе вы найдете один как /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
должен работать почти везде. Даже busybox имеет awk
.
Если H
oldspace пусто, вы также можете сделать:
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
восьмерик и прочее.
Со gnu sed
следующим также работает:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Вам нужно решение в sed, и это уже дано ниже. Но я хотел добавить еще одну возможность, что ИМХО проще и быстрее,
tr -d "\n"