Возможно, я не правильно понял ваш вопрос, но рискну ответить.
Если вы хотите сопоставить все, кроме новой строки, простая точка регулярного выражения .
делает именно это: соответствует любому символу, кроме новых строк.
Давайте попробуем это с не 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
Выражение [^ ing]
означает любой одиночный символ, кроме i
, n
или g
. Следовательно, приветствие [^ ing]
не соответствует только в случае приветствия
, потому что нет дополнительных символов для сопоставления (или несовпадения).
Кажется, вы пытаетесь реализовать отрицательный просмотр вперед , то есть утверждение нулевой длины, которое соответствует cheer
, за исключением тех случаев, когда за ним следует строка ing
. Это непросто в sed
, но относительно просто в perl
с использованием синтаксиса (?! ing)
ie
perl -pe 's/cheer(?!ing)/lalaland/g' test
lalaland
cheering
.
word
lalalandytree
alalalandytree
Шаблон [^ ing]
не выполняет то, что вы думаете: он соответствует одному символу
, который не должен быть ни одним из i
, n
или g
.
Если вашу проблему можно перефразировать как «заменить экземпляры приветствия
целым словом», то следующее может сработать, используя маркер для границ слова
, \ b
:
sed 's/\bcheer\b/lalaland/g'