Как заменить все символы в строке, которые не соответствуют шаблону в sed?

вы так близко :просто бросьте .Вы говорите, что начинается с какого-то символа, тогда // …

sed -i "1s/\/\/-----------/& %TAG/" FILE.txt

или измените разделитель, чтобы уменьшить экранирование.

sed -i "1s#//-----------#& %TAG#" FILE.txt

-1
11.09.2020, 23:55
2 ответа

Во-первых, вам нужно sed -E, чтобы шаблон интерпретировался как расширенное регулярное выражение (ERE ), а простые круглые скобки работали для группировки. По умолчанию шаблон sed представляет собой базовое регулярное выражение (BRE ), и вам нужно будет использовать \(и \).

Во-вторых, sed -n '/.../p'работает, но, конечно, печатает всю строку, если часть ее совпадает. Если ваш паттерн также был закреплен в конце, то было бы полезно удалить всю строку.

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

sed -E -e 's/^([a-zA-Z0-9](-*[a-zA-Z0-9])*).*/\1/' input.txt

Завершающий элемент .*обеспечивает соответствие всей строки, после чего все заменяется тем, что находится в первой группе захвата. При вводе something_something_somethingбудет напечатано something, так как _не соответствует основной части шаблона.

Обратите внимание, что ваш шаблон выглядит так, будто он эквивалентен просто [-a-zA-Z0-9]+. Возможно, вы имеете в виду что-то вроде [a-zA-Z0-9]+(-[a-zA-Z0-9]+)*? Это должно соответствовать таким строкам, как fooили foo-bar-doodoo(, но неfoo--bar).

0
18.03.2021, 23:05

Мы составляем еще одно регулярное выражение, хранящееся в переменной оболочки с именем sNr (Search n Replace ), где мы добавляем к вашему регулярному выражению something, которое вы цитировали.

Мы заменим любой не -символ something на хэш (#).

sNr='
 s@
  \(
   \(
    \(
      [a-zA-Z0-9](-*[a-zA-Z0-9])*
    \)\{1,\}
    #*
  \)*
 \)
 [^a-zA-Z0-9#]
 @\1#@
';

echo something_something_something |
sed -e "
  :loop
    ${sNr//[$IFS]/}
  tloop
"
something#something#something
0
18.03.2021, 23:05

Теги

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