Замените всеми случаями шаблона с первой подобранной группой

OpenSSH 6.2 представленный несколько методов аутентификации.

Для ссылок см. sshd_config (5).

2
21.11.2018, 00:05
4 ответа
:%s/match\$\zs\(\w\+\)\(.*match\$\)xxx/\1\2\1/

Объяснение

  • Соответствие \ $ \ ZS : закрепляйте матч в первом сопоставление $ ; Я использую \ ZS \ ZS , чтобы запустить совпадение после этого, чтобы избежать еще одной группы захвата
  • \ (\ W \ + \) : захватить текст после первого вхождения совпадение $
  • \ (. * Match \ $ \) : захватить то, что после этого, до второго возникновения соответствует $ , и захватить, что, как мы хотим сохранить его
  • XXX : соответствует замену

замена : текст после первого вхождения, затем текст между ними, затем первый текст снова (замена xxx ).

2
27.01.2020, 21:56
:%s/\v(match\$(\w+).*match\$)xxx/\1\2/
  • \v очень волшебно (мы можем использовать меньше \\)
1
27.01.2020, 21:56

Использование Баш Массивы :

pa=("/home/user/folder1" "/home/user/fol der2")
find "${pa[@]}" -name '*xy*' ... 

Обсуждение

Соблюдайте, что \ не делает то, что можно надеть:

$ pa="/home/user/folder1 /home/user/fol\ der2"
$ printf '%s\n' $pa
/home/user/folder1
/home/user/fol\
der2

\ в Определение PA становится буквальным символом в строке, а не побег. Если вы хотите список отдельных строк, используйте массив.

-121--125626-

Попробуйте это:

sed -e 's/\(match\$\)\([a-zA-Z_]\+\)\([a-zA-Z ]\+match\$\)[a-zA-Z]\+/\1\2\3\2/' < input.txt > output.txt

Использование ввода input.txt :

text match$something_here and match$xxx blablabla
text match$something_else_here and match$xxx blablabla

Я получаю output.txt :

text match$something_here and match$something_here blablabla
text match$something_else_here and match$something_else_here blablabla
1
27.01.2020, 21:56
sed -e 's/\(match\)\([_[:alnum:]]*\)\(\(.*\)\n\)*/\1\
/2;tc' -e b -e :c -e 's//\1\2\4\2/'

Вышеупомянутая последовательность всегда будет обрабатывать только первое и второе вхождения match в строку - независимо от того, сколько их может быть на линия.

Он работает, выполняя первую замену s /// на s /// 2 cd вхождении шаблона, тогда, если подстановка t успешен, b ранжируется до : c ontinue лейбла, или, если нет, b выходит за пределы сценария.

Таким образом, когда есть второе совпадение шаблона, шаблон повторяется для команды 2cd s /// ubstitution. Но когда его нет, строки печатаются как обычно.

Важным моментом является подвыражение \ (\ (. * \) \ N \) * . Подвыражение соответствует только нулевой строке для первой команды s /// 2 , потому что в результате \ n ewline может встречаться только в пространстве шаблонов sed редактирования. Но когда шаблон повторяется, \ (\ (. * \) \ N \) * соответствует любому / всем символам, встречающимся между двумя совпадениями , потому что предыдущие s /// ubstitution вставил \ n ewline при замене [_ [: alnum:]] * . Таким образом, один и тот же повторяющийся шаблон может означать две разные вещи в зависимости от его контекста в сценарии.

Хотя приведенная выше версия должна работать так, как написано для любого POSIX sed (акцент на должен - многие sed не работают) соответствуют стандартам повторяющихся подвыражений) , w / GNU sed , вы можете написать его немного короче:

sed -E 's/(match)(\w*)((.*)\n)*/\1\n/2;T;s//\1\2\4\2/
' <<\IN
text match_something_here and !m!atch_xxx blablabla
text match_something_here and match_xxx blablabla
text match_something_else_here and match_xxx blablabla
text match_something_here and match_xxx blablabla match_xxx blablabla
text match_something_else_here and match_xxx blablabla match_xxx blablabla match_xxx blablabla
IN

... От << \ IN до IN Бит - это просто ввод в документ, поэтому я могу продемонстрировать, как он работает - вы, вероятно, должны использовать вместо него . Также обратите внимание, что я изменил ваши $ something и $ xxx на _something и _xxx , потому что, насколько я понимаю, эти знаки доллара должны фактически не будет включен в шаблон замены, но будет заменен чем-то другим. Если это правда, то вы можете оставить там escape-символ \ w * ord или, если вы хотите, чтобы были включены буквальные знаки доллара, вы все равно должны определить свой собственный класс символов и добавить его, например: [ $ _ [: alnum:]] * .

Обратите внимание, что tc '-e b -e: c -e сокращается до - с GNU sed - просто T .В то время как переносимость t est привела к успешной подстановке b , проходящей через точку, в которой неудачные строки b разошлись, на GNU sed you can T est для неудачных результатов - что напрямую разветвляет их, и единственные оставшиеся строки, все еще выполняющие скрипт в этот момент, - это те, которые действительно успешно заменили вторую пару совпадений на ] \ n ewline.

В любом случае (в зависимости от sed ) любой из вышеперечисленных напечатает:

text match_something_here and !m!atch_xxx blablabla
text match_something_here and match_something_here blablabla
text match_something_else_here and match_something_else_here blablabla
text match_something_here and match_something_here blablabla match_xxx blablabla
text match_something_else_here and match_something_else_here blablabla match_xxx blablabla match_xxx blablabla
1
27.01.2020, 21:56

Теги

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