Я настільки переплутана з безліччю варіантів 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
.
Якщо H
oldspace порожній, ви також можете зробити:
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"