Я так запутался с множеством опций 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.
Если 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восьмерик и прочее.
Со gnu sedследующим также работает:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Вам нужно решение в sed, и это уже дано ниже. Но я хотел добавить еще одну возможность, что ИМХО проще и быстрее,
tr -d "\n"