Sed может быть трудно держать совместимы, в зависимости от ваших требований.Но, так как вы просто хотели один лайнер, Perl будет делать эту работу и может быть более портативными
Если вам нужны две пустые строки (3 перевода строки между текстом):
perl -p0777i -e 's/^\n{3,}/\n\n/; s/\n{4,}/\n\n\n/sg;' yourfile.txt
Если вам нужен один пустые строки (2 между текстом символы перевода строки):
perl -p0777i -e 's/^\n{2,}/\n/; s/\n{3,}/\n\n/sg;' yourfile.txt
Если вам нужна одна пустая строка, но не новой строки в начале файла:
perl -p0777i -e 's/^\n+//; s/\n{3,}/\n\n/sg;' yourfile.txt
Если вы не особенно заботятся о том, Theres один или два холостых в начале файла:
perl -p0777i -e 's/\n{3,}/\n\n/sg;' yourfile.txt
тест сценария:
#!/bin/bash
test_contents()
{
cat <<EOF
3 blank lines 3 linefeeds prior, expect 1 removed
3 blank lines 4 linefeeds after, expect 1 removed
1 blank line, 2 linefeeds after, expect no change
2 blank line, 3 linefeeds after, expect no change
5 blank lines, 6 linefeeds after, expect 3 removed
3 lines to end of file, expect 1 removed
EOF
}
before=$(mktemp -t test_before.XXXXXX)
after=$(mktemp -t test_after.XXXXXX)
sed_after=$(mktemp -t test_sed.XXXXXX)
test_contents > "${before}"
test_contents > "${after}"
test_contents > "${sed_after}"
perl -p0777i -e 's/^\n{3,}/\n\n/; s/\n{4,}/\n\n\n/sg;' "${after}"
echo Orig:
cat "${before}"
echo "Diff:"
diff -U1000 "${before}" "${after}"
Что это делает:
-p0777 read whole files in one go
-i edit files specified on commandline
-e specify the edit expression
Параметр выражения/sg
Средства:
s - treat as a whole string including newlines
g - keep applying the edits until no more can be done
выход:
+ diff -U1000 /tmp/test_before.XSRHYr /tmp/test_after.mU4hLU
--- /tmp/test_before.XSRHYr 2017-02-14 21:31:09.376110847 +1030
+++ /tmp/test_after.mU4hLU 2017-02-14 21:31:09.379110855 +1030
@@ -1,23 +1,17 @@
-
3 blank lines 3 linefeeds prior, expect 1 removed
3 blank lines 4 linefeeds after, expect 1 removed
-
1 blank line, 2 linefeeds after, expect no change
2 blank line, 3 linefeeds after, expect no change
5 blank lines, 6 linefeeds after, expect 3 removed
-
-
-
3 lines to end of file, expect 1 removed
-
Можете ли вы уточнить некоторые примеры входов и выходов? Как бы то ни было, я не могу сказать, хотите ли вы две пустые строки (три строки новой строки) или две новые строки (одна пустая строка) между абзацами. Пример того, что вы ожидаете, прояснит это. Благодарю. –