Замена строк регулярным выражением в sed

Альтернатива, быстрый псевдоним в.bashrc:

echo "alias nano='nano -c -l'" >> ~/.bashrc && source ~/.bashrc && reset

Принудительное использование синтаксиса кажется обязательным для скриптов hashbang, поэтому для принудительного выделения определенной области:

echo "alias nano='nano --syntax=php -c -l'" >> ~/.bashrc && source ~/.bashrc && reset

человек нано

0
12.03.2021, 08:26
2 ответа

Есть ряд вопросов:

  1. внутри одинарных кавычек двойные кавычки являются буквальными -, так как вывод вашей команды не содержит ", он никогда не будет совпадать

  2. если вывод вашей команды имел начальные кавычки, то якорь строки ^никогда не мог соответствовать после такого символа

  3. возможно, вы тестировали регулярное выражение в движке, поддерживающем модификатор Perl ?non -greedy -в sed, ?либо литерал (BRE ), либо простой квантификатор (ERE, как здесь с флагом -E), где он заставит .*жадно соответствовать 0 или 1 раз

  4. \sсоответствует только одиночному пробелу; также как и .*?это строго расширение Perl (хотя последние версии GNU sed поддерживают его)-для переносимости, возможно, вам придется изменить его на[[:blank:]]

  5. |внутри [...]не представляет собой чередование (однако это не помешает совпадению выражения, но также будет соответствовать символу |)

Предполагая, что ваша реализация sed поддерживает \sи его дополнение \S, возможно, вы имели в виду что-то вроде

sed -E 's/^(\S+\s+)([A-Za-z].*)/\2/'

хотя можно и проще

sed -E 's/\S+\s+(.*)/\1/'

или даже просто

sed -E 's/\S+\s+//'

, чтобы сопоставить последовательность не -пробелов, за которой следует последовательность пробелов, и удалить ее. Если ваш sed не предоставляет \sи \S `, вы можете сделать то же самое с классами символов POSIX, как

sed -E 's/[^[:blank:]]+[[:blank:]]+//'

или, если вы ограничены полной последовательностью POSIX (, где +не является квантифером независимо от режима)

sed 's/[^[:blank:]]\{1,\}[[:blank:]]\{1,\}//'

См. также Почему мое регулярное выражение работает в X, но не в Y?

2
18.03.2021, 22:25

Найдите ряд пробелов после небелого пробела и измените его на новую строку (, так как ее наверняка не будет ). Затем уберите все до новой строки. Вы только что удалили первое поле.

sed -e 's/\S\s+/\n/;s/.*\n//' file
-1
18.03.2021, 22:25

Теги

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