sed заменить только некоторые буквы regex

Возможно, я не правильно понял ваш вопрос, но рискну ответить.

Если вы хотите сопоставить все, кроме новой строки, простая точка регулярного выражения . делает именно это: соответствует любому символу, кроме новых строк.

Давайте попробуем это с не gnu sed:

$ cat file5
home
help
variables
compatibility

$ sed 's/./_/g' file5
____
____
_________
_____________

$ echo "one
two
three
four" |sed 's/./_/g'
___
___
_____
____

Кстати, ваш самый первый пример sed:

echo "one
two" | sed 'N;s/\n/_/g'

соответствует только следующей новой строке, а не каждой новой строке:

$ echo "one
> two
> three
> four" |sed 'N;s/\n/_/g'
one_two
three_four
0
09.02.2017, 19:20
2 ответа

Выражение [^ ing] означает любой одиночный символ, кроме i , n или g . Следовательно, приветствие [^ ing] не соответствует только в случае приветствия , потому что нет дополнительных символов для сопоставления (или несовпадения).

Кажется, вы пытаетесь реализовать отрицательный просмотр вперед , то есть утверждение нулевой длины, которое соответствует cheer , за исключением тех случаев, когда за ним следует строка ing . Это непросто в sed , но относительно просто в perl с использованием синтаксиса (?! ing) ie

perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree

См. Lookahead и Lookbehind Zero- Утверждения длины

1
28.01.2020, 02:15

Шаблон [^ ing] не выполняет то, что вы думаете: он соответствует одному символу , который не должен быть ни одним из i , n или g .

Если вашу проблему можно перефразировать как «заменить экземпляры приветствия целым словом», то следующее может сработать, используя маркер для границ слова , \ b :

sed 's/\bcheer\b/lalaland/g'
5
28.01.2020, 02:15

Теги

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