sed: Игнорировать начальные пробелы при глобальной замене

Если вы хотите удалить первые 2 байта, вы можете попробовать:

dd if=orginal_file of=new_file ibs=2 skip=1

Это выведет new_fileс пропущенными первыми 2 байтами.

5
04.04.2020, 18:23
2 ответа
$ sed 's/\>[[:blank:]]\{1,\}/ /g' file
     This is an indented paragraph. The indentation should not be changed.
This is the second line of the paragraph.

Выражение, которое я использовал, соответствует одному или нескольким[[:blank:]](пробелам или табуляциям)после слова и заменяет их одним пробелом. \>соответствует границе нулевой ширины -между символом слова -и символом не -слова -.

Это было протестировано с исходным кодом OpenBSD sed, но я думаю, что он должен работать и с GNU sed. GNU sedтакже использует \bдля сопоставления границ слов.

Вы также можете использовать sed -E, чтобы сократить это до

sed -E 's/\>[[:blank:]]+/ /g' file

Опять же, если \>не работает для вас с GNU sed, используйте вместо этого \b.


Обратите внимание, что, хотя приведенный выше пример правильно сортирует текст вашего примера, он не совсем работает для удаления пробелов после знаков препинания, как после первого предложения в

     This is     an indented      paragraph.        The   indentation   should not be changed.
This is the     second   line  of the    paragraph.

Для этого подойдет немного более сложный вариант:

$ sed -E 's/([^[:blank:]])[[:blank:]]+/\1 /g' file
     This is an indented paragraph. The indentation should not be changed.
This is the second line of the paragraph.

Это заменяет любой непустой символ -, за которым следует один или несколько пустых символов, на непустой символ -и один пробел.

Или, используя стандартнуюsed(и очень маленькую оптимизацию, которая будет выполнять замену, только если есть два или более пробела/табуляции после не -пробела/табуляции ),

$ sed 's/\([^[:blank:]]\)[[:blank:]]\{2,\}/\1 /g' file
     This is an indented paragraph. The indentation should not be changed.
This is the second line of the paragraph.
8
28.04.2021, 23:18

POSIXly:

sed 's/\([^[:space:]]\)[[:space:]]\{1,\}/\1 /g; s/[[:space:]]*$//'

Который заменяет любую последовательность из одного или нескольких пробельных символов, следующих за не -пробелом, этим не -пробелом и одним единственным символом SPC, а также удаляет конечные пробельные символы, которые закрывают пустые строки и строки с замыкающими пробел (включая CR в конце строк, поступающих из текстовых файлов Microsoft ).

5
28.04.2021, 23:18

Теги

Похожие вопросы