Я настільки переплутана з безліччю варіантів 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 році. Єдиним місцем, де це може не працювати, були б нереалізовані на реалізацію POSIX-версії, sedподібні до деяких зведених на основі зайнятих наборів. Це не працюватиме в csh, але це проблема csh.
\\nвикористовується в пошуковій частині, чому б не використати \nзаміну? перший, здається, означає, що останній існує. тобто. чому б це не так$ echo '1\n2'|sed 's/\\n/\n/g'
\nце буквальне значення, маючи на увазі, що він відображається як два символи: зворотний проріз, за яким слідує 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, і користуватися лише тими функціями, і вам слід добре. На Solaris ви знайдете як /usr/xpg4/bin/awk.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'?
gsub()повинен працювати майже всюди. Навіть зайнятий ящик має awk.
Якщо 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таке.
З gnu sedнаступним також працює:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Вам потрібен розчин у sed, і це вже наведено нижче. Але я хотів додати ще одну можливість, що IMHO просто простіше і швидше,
tr -d "\n"