Sed регулярное выражение для соответствия содержимого между ""

Я пытаюсь заменить что-либо между "" в следующем файле с хх.

ИСХОДНЫЙ ФАЙЛ

event syslog pattern "random text" maxrun 50 ratelimit 50
action 0.1 cli command "random text"
action 0.2 cli command "random text"
action 0.4 cli command "random text"
action 0.4 cli command "random text"
action 0.3 cli command "random text"
action 0.4 cli command "random text"
action 0.5 cli command "random text"
action 0.6 cli command "random text"
action 0.7 cli command "random text"
action 0.8 cli command "random text"
action 0.9 cli command "random text"
action 1.1 cli command "random text"
action 1.2 cli command "random text"
action 1.3 cli command "random text"
action 1.4 cli command "random text"
action 1.5 cli command "random text"
action 1.6 cli command "random text"
action 1.7 cli command "random text"
action 1.8 cli command "random text"
action 1.9 cli command "random text"
action 2.1 cli command "random text"
action 2.2 cli command "random text"
action 2.3 cli command "random text"

Я использовал sed для этого, но первый случай не работает. Могу ли я получить некоторые объяснения по поводу синтаксиса?

Случай 1: почему оригинал "" не сохраняется при замене на хх?

Первая попытка - не работает

$ sed -e 's/".*"/xx/g' eem.txt
event manager applet monitorHealth authorization bypass
event manager applet monitorHealth
event syslog pattern xx maxrun 50 ratelimit 50
action 0.1 cli command xx
action 0.2 cli command xx
action 0.4 cli command xx
action 0.4 cli command xx
action 0.4 cli command "undebug all”
action 0.3 cli command xx
action 0.4 cli command xx
action 0.5 cli command xx
action 0.6 cli command xx
action 0.7 cli command xx
action 0.8 cli command xx
action 0.9 cli command xx
action 1.1 cli command xx
action 1.2 cli command xx
action 1.3 cli command xx
action 1.4 cli command xx
action 1.5 cli command xx
action 1.6 cli command xx
action 1.7 cli command xx
action 1.8 cli command xx
action 1.9 cli command xx
action 2.1 cli command xx
action 2.2 cli command xx
action 2.3 cli command xx

Вторая попытка - рабочая

Случай 2: Могу ли я получить какое-то объяснение вокруг «[^»] «Из того, что я видел, [^»] означает «не соответствует символу», но я не могу соединить логику.

$  sed -n 's/"[^"]*"/"xx"/gp' eem.txt
event syslog pattern "xx" maxrun 50 ratelimit 50
action 0.1 cli command "xx"
action 0.2 cli command "xx"
action 0.4 cli command "xx"
action 0.4 cli command "xx"
action 0.3 cli command "xx"
action 0.4 cli command "xx"
action 0.5 cli command "xx"
action 0.6 cli command "xx"
action 0.7 cli command "xx"
action 0.8 cli command "xx"
action 0.9 cli command "xx"
action 1.1 cli command "xx"
action 1.2 cli command "xx"
action 1.3 cli command "xx"
action 1.4 cli command "xx"
action 1.5 cli command "xx"
action 1.6 cli command "xx"
action 1.7 cli command "xx"
action 1.8 cli command "xx"
action 1.9 cli command "xx"
action 2.1 cli command "xx"
action 2.2 cli command "xx"
action 2.3 cli command "xx"

Благодарю.

Всего 1 ответ


Для вашего первого примера:

$ sed -e 's/".*"/xx/g' eem.txt

Двойные кавычки не появляются в замене, потому что вы никогда не помещаете их туда. Если вы хотите заменить на "xx" , то сделайте это:

$ sed -e 's/".*"/"xx"/g' eem.txt

Для вашего второго примера:

$  sed -n 's/"[^"]*"/"xx"/gp' eem.txt

Это заменит "xx" , но только потому, что вы использовали двойные кавычки в замене. Что касается "[^"]*" , это просто говорит, что соответствует двойной кавычке, за которой следует любое количество не двойных кавычек, а затем еще одна двойная кавычка.

В некоторых вариантах регулярных выражений, например, в Perl, мы могли бы также написать ".*?" сделать то же самое. Это называется ленивая точка и означает, что она будет потреблять что-либо до первой найденной двойной кавычки.


Есть идеи?

10000