Sed + Regex, который будет соответствовать любой строке, кроме тех, которые начинаются с обратной кавычки

Я пытаюсь придумать оператор sed, который будет соответствовать регулярному выражению, чтобы включать каждую строку, которая не начинается с обратной кавычки `.

Цель состоит в том, чтобы добавить что-то в начало каждой строки, которая не начинается с обратной кавычки.

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

Вот что у меня есть до сих пор:

cat myfile.txt
`this line starts with backtick`

  `this one does too, but there are some spaces`

!some stuff on May 14 19:52:58 2020

more stuff *(&) 243123123123
  indented stuff
  indented stuff

string here that is nothing special
*here is an asterisk

  match `this line`
  1 number one
  2 number two

 `ignore this one`

А вот мое выражение sed (на Mac).

sed -e 's/^\([^[\s*`].*\)/--matched--\1/g' myfile.txt

`this line starts with backtick`

--matched--  `this one does too, but there are some spaces`

--matched--!some stuff on May 14 19:52:58 2020

--matched--more stuff *(&) 243123123123
--matched--  indented stuff
--matched--  indented stuff

string here that is nothing special
*here is an asterisk

--matched--  match `this line`
--matched--  1 number one
--matched--  2 number two

--matched-- `ignore this one`

Изменить: ясность


person yeahb2018    schedule 19.05.2020    source источник


Ответы (2)


Самый простой способ сделать это — сопоставить те, которые вы хотите игнорировать, а затем отменить совпадение. Вот POSIX-совместимый способ сделать это:

sed --posix '/^[[:space:]]*`/!{/^$/!s/^/--matched---/}' ./myfile.txt

Доказательство концепции

$ sed --posix '/^[[:space:]]*`/!{/^$/!s/^/--matched---/}' ./myfile.txt
`this line starts with backtick`

  `this one does too, but there are some spaces`

--matched---!some stuff on May 14 19:52:58 2020

--matched---more stuff *(&) 243123123123
--matched---  indented stuff
--matched---  indented stuff

--matched---string here that is nothing special
--matched---*here is an asterisk

--matched---  match `this line`
--matched---  1 number one
--matched---  2 number two

  `ignore this one`
person SiegeX    schedule 19.05.2020
comment
Спасибо, я действительно хочу добавить к каждой строке (которая не начинается с `) что-то еще. Я, вероятно, могу использовать этот подход и сделать это в два этапа, но я надеялся сделать все за один раз. - person yeahb2018; 19.05.2020
comment
@yeahb2018 обновил мое доказательство концепции, чтобы показать, как это можно сделать. - person SiegeX; 19.05.2020
comment
Доказательство концепции для правильного решения, которое НЕ является вещью в вашей первой строке. В первой строке используется флаг -n и команда p, а не то, что делает (правильное) решение в Proof of Concept. - person mathguy; 19.05.2020
comment
Спасибо @SiegeX, это отлично работало в Linux, но похоже, что моему Mac это не нравится (BSD). Я проведу некоторые исследования, но, по крайней мере, в Linux (GNU) он работает именно так, как мне нужно. - person yeahb2018; 19.05.2020
comment
@yeahb2018 хм, не знаю, почему это так, команда, которую я использую, совместима с POSIX. Вы можете проверить это сами (в Linux), добавив опцию --posix сразу после вызова sed. Вы все равно должны получить тот же результат. Что говорит вам BSD sed? - person SiegeX; 19.05.2020
comment
@SiegeX, я обнаружил, что мне нужно использовать '', чтобы запустить его. Однако он не выполняет добавление в начале: ``` sed '' '/^[[:space:]]*/!{/^$/!s/^/--matched---/}' ./file sed: /^[[:space:]]*/!{/^$/!s/^/--matched---/}: такого нет. файл или каталог this line starts with backtick this one does too, but there are some spaces !что-то 14 мая 19:52:58 2020 еще материал *(&) 243123123123 ``` - person yeahb2018; 19.05.2020

Это может сработать для вас (GNU sed):

sed  '/^\s*$\|^\s*`/!s/^/--matched--/' file

если строка пуста (может также содержать только пробелы) или первый символ, не являющийся пробелом, является галочкой, не добавляйте --matched--.

person potong    schedule 19.05.2020