использование sed для замены двух шаблонов в более крупном шаблоне

использование sed как я могу заменить два шаблона в более крупном шаблоне на одной строке?

учитывая одну строку текста, я хочу найти шаблон (назовем это внешним шаблоном), а затем в этом внешнем шаблоне заменить два внутренних шаблона.

вот пример ввода текста в одну строку:

Z:sourceprivatemaindeveloperfoosetenv.sh(25):     export 'FONTCONFIG_PATH'="$WINE_SHARED_SUPPORT/X11/etc/fonts"

в примере выше внешний шаблон /^.*([[:digit:]]+):/, который должен быть равен Z:sourceprivatemaindeveloperfoosetenv.sh(25): два внутренних шаблона /^[A-Za-z]:/ и //.

еще один способ сформулировать мой вопрос:

используя sed, я знаю, как выполнять замену шаблона, используя s команда, но как я могу ограничить диапазон s команда, так что он работает только на части входной строки до (25):?

конечный результат, который я пытаюсь получить, - строка текста преобразуется в это:

/enlistments/source/private/main/developer/foo/setenv.sh(25):     export 'FONTCONFIG_PATH'="$WINE_SHARED_SUPPORT/X11/etc/fonts"
3
задан gronostaj
04.01.2023 19:07 Количество просмотров материала 3052
Распечатать страницу

4 ответа

эта команда преобразует пример ввода в пример вывода:

sed 's|\|/|g;s|^[^/]*|/enlistments|'

если часть входных данных содержит обратную косую черту после /^.*([[:digit:]]+):/ часть, то вам придется разделить и победить, чтобы предотвратить эти последние обратные косые черты от замены.

sed 'h;s/^.*([[:digit:]]\+)://;x;s/^\(.*([[:digit:]]\+):\).*//;s|\|/|g;s|^[^/]*|/enlistments|;G;s/\n//'

объяснение (шаги, отмеченные звездочкой ([*]) применяются к обеим командам):

  • h - копировать строку для удержания пробел
  • s/^.*([[:digit:]]\+):// - удалить первую часть строки из оригинала в pattern space
  • x - поменять шаблон пространства и удерживайте пробел
  • s/^\(.*([[:digit:]]\+):\).*// - сохранить первую часть строки из копии (отбросить последнюю часть)
  • s|\|/|g -[*] измените все обратные косые черты на косые (в версии "разделяй и властвуй" только часть в пространстве шаблонов-первая часть линии-это пострадавших)
  • s|^[^/]*|/enlistments| -[*] измените все, что появляется перед первой косой чертой, на "/ enlistments " - это можно сделать более избирательным, если это необходимо
  • G - добавить новую строку и содержимое hold space в конец pattern space
  • s/\n// - удалить внутреннюю новую строку
1
отвечен Dennis Williamson 2023-01-06 02:55

есть два факта, которые я думаю, вы найдете полезными:

  1. по умолчанию sed заменяет только первое вхождение строки в строке. Поэтому дана следующая строка:

    foo foo
    

    команда sed s/foo/bar/ в результате:

    bar foo
    
  2. вы можете ограничить команду sed строками, соответствующими определенному шаблону. Если вы хотите выполнить вышеуказанную подстановку только в строках, содержащих строку "xyz" , вы должны использовать команду примерно так:

    sed '/xyz/ s/foo/bar/'
    

Я думаю, что это должно помочь вам делать то, что вы хотите.

0
отвечен larsks 2023-01-06 05:12

можно попробовать

sed -r 's/^[A-Z]:\|\/\//g' | sed 's/^/\/enlistments/'

Так вот, это, конечно, требует, чтобы в части после (25) не было обратных слешей: для работы. Но поскольку я подозреваю, что это никогда не произойдет из-за структуры пути unix, это никогда не будет так.

0
отвечен JaHei 2023-01-06 07:29

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

sed 's/([0-9]\+):/&\n/;h;s/\n.*//;y/\/\//;s/[^/]*/\/enlistments/;G;s/\n.*\n//' file
0
отвечен potong 2023-01-06 09:46

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх