вы так близко :просто бросьте .
Вы говорите, что начинается с какого-то символа, тогда // …
sed -i "1s/\/\/-----------/& %TAG/" FILE.txt
или измените разделитель, чтобы уменьшить экранирование.
sed -i "1s#//-----------#& %TAG#" FILE.txt
Во-первых, вам нужно 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
).
Мы составляем еще одно регулярное выражение, хранящееся в переменной оболочки с именем 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