Jestem tak pomylony z niezliczonymi opcjami GNU sed, POSIX sedi BSD sed. Jak zastąpić literał \nznakiem nowej linii, używając tych trzech sedtypów?
foo\\nbarlub foo\\\nbar?
Jestem tak pomylony z niezliczonymi opcjami GNU sed, POSIX sedi BSD sed. Jak zastąpić literał \nznakiem nowej linii, używając tych trzech sedtypów?
foo\\nbarlub 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.
sedpoleceniem w Uniksie v7 w 1979 roku. Jedynym miejscem, w którym to może nie działać, byłyby uproszczone implementacje inne niż POSIX, sedtakie jak niektóre zredukowane oparte na busyboksie. To nie zadziała w csh, ale jest to problem csh.
\\njest używany w części wyszukiwania, dlaczego nie użyć \nw zamianie? pierwsze wydaje się sugerować, że drugie istnieje. to znaczy. dlaczego nie to$ echo '1\n2'|sed 's/\\n/\n/g'
\njest 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ą sedodpowiedź, wspomnę tylko, że sedrzadko jest to najlepsze narzędzie, jeśli chcesz w jakiś sposób manipulować nowymi liniami. Perl jest prawie tak samo przenośny, jak sedzainstalowany 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.
awkma podobne problemy z przenośnością (czy moja awkzwykła stara awk, nawkczy 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).
awkprzenośność, trzymaj się wersji awkzgodnej 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 Holdspace 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 \backspace i \return oraz \00ósemki i co chcesz.
Z gnu sednastę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"