Jestem tak pomylony z niezliczonymi opcjami GNU sed
, POSIX sed
i BSD sed
. Jak zastąpić literał \n
znakiem nowej linii, używając tych trzech sed
typów?
foo\\nbar
lub foo\\\nbar
?
Jestem tak pomylony z niezliczonymi opcjami GNU sed
, POSIX sed
i BSD sed
. Jak zastąpić literał \n
znakiem nowej linii, używając tych trzech sed
typów?
foo\\nbar
lub foo\\\nbar
?
Odpowiedzi:
sed 's/\\n/\
/g'
Zwróć uwagę na odwrotny ukośnik tuż przed naciśnięciem klawisza return w ciągu zastępującym.
sed
poleceniem w Uniksie v7 w 1979 roku. Jedynym miejscem, w którym to może nie działać, byłyby uproszczone implementacje inne niż POSIX, sed
takie jak niektóre zredukowane oparte na busyboksie. To nie zadziała w csh, ale jest to problem csh.
\\n
jest używany w części wyszukiwania, dlaczego nie użyć \n
w zamianie? pierwsze wydaje się sugerować, że drugie istnieje. to znaczy. dlaczego nie to$ echo '1\n2'|sed 's/\\n/\n/g'
\n
jest dosłowny, co oznacza, że pojawia się jako dwa znaki: przerywnik, po którym następuje n
, a nie jako pojedynczy znak nowej linii. Stąd dwa ukośniki odwrotne za uczynienie ukośnika dosłownym, a następnien
Ponieważ masz już przenośną sed
odpowiedź, wspomnę tylko, że sed
rzadko jest to najlepsze narzędzie, jeśli chcesz w jakiś sposób manipulować nowymi liniami. Perl jest prawie tak samo przenośny, jak sed
zainstalowany domyślnie na większości systemów * nix i może sobie z tym poradzić bardzo łatwo:
printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'
Innym bardzo przenośnym wyborem jest awk
:
printf '%s\n' 'aa\nbb' | awk '{gsub("\\\\n","\n")};1'
W systemie Solaris pamiętaj o użyciu standardowego awk w / usr / xpg4 / bin, ten w / bin jest historycznym i nie powinien być używany w nowych skryptach.
awk
ma podobne problemy z przenośnością (czy moja awk
zwykła stara awk
, nawk
czy gawk
?). W rzeczywistości brakuje wersji w moich pudełkach Solaris gsub()
. Mój głos tutaj dotyczy Perla ( perl -nlawe '...'
przybliżone automatyczne zachowanie awk
).
awk
przenośność, trzymaj się wersji awk
zgodnej z POSIX i używaj tylko tych funkcji i wszystko powinno być w porządku. W systemie Solaris znajdziesz jeden jako /usr/xpg4/bin/awk
.
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
powinno działać wszędzie. Nawet busybox ma awk
.
Jeśli H
oldspace jest pusty, możesz także:
sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'
... ale odpowiedź uxnut jest już szybsza i prostsza, więc możesz wziąć ją tak, jak chcesz.
Inna obca możliwość:
INPUT | sed -n l | while read v ; do printf "${v%?}" ; done
Ale uwaga ^, która tłumaczy wszystkie standardowe znaki \
ukośnika odwrotnego w stylu C - takie jak \b
ackspace i \r
eturn oraz \00
ósemki i co chcesz.
Z gnu sed
następujących działa również:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
Potrzebujesz rozwiązania w sed, a to już podano poniżej. Chciałem jednak dodać kolejną możliwość, że IMHO jest po prostu łatwiejsze i szybsze,
tr -d "\n"