Подстановка нескольких вхождений символа в совпадении grep - PullRequest
0 голосов
/ 05 октября 2018

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

Например, я хотел бы взять что-то вроде

xx+xx <f>bar+bar+fo+bar+fe</f> yy+y <f>fee+bar</f> zz

, сопоставить все в пределах <f> и </f>, а затем заменить все +, скажем,* (но ТОЛЬКО внутри тега "f").

xx+xx <f>bar*bar*fo*bar*fe</f> yy+y <f>fee*bar</f> zz

Я думаю, что могу легко сопоставить теги "f", содержащие +, с выражением типа

<f>[^<]*\+[^<]*</f>

но я понятия не имею, как заменить только подкласс символа для каждого совпадения.Я априори не знаю, сколько + в каждом теге.Я думаю, что я должен запустить регулярное выражение для всех совпадений первого регулярного выражения, но я не совсем уверен, как это сделать.

(Другими словами, я хотел бы сопоставить все +, но тольковнутри специальных тегов угловых скобок).

У кого-нибудь есть подсказка?

Большое спасибо, Даниэле

1 Ответ

0 голосов
/ 05 октября 2018

Если у вас все в порядке с решением на awk:

$ awk '{
    while ( match($0,/<f>[^<]*\+[^<]*<\/f>/) ) {
        tgt = substr($0,RSTART,RLENGTH)
        gsub(/\+/,"*",tgt)
        $0 = substr($0,1,RSTART-1) tgt substr($0,RSTART+RLENGTH)
    }
    print
}' file
xx+xx <f>bar*bar*fo*bar*fe</f> yy+y <f>fee*bar</f> zz

Вышеприведенное будет работать при использовании любого awk в любой оболочке на любом компьютере UNIX.Он основан на том, что в каждом <f>...</f> нет <, как указано в вашем примере кода.Если это возможно, включите это в ваш пример, и мы можем настроить скрипт для его обработки:

$ awk '{
    gsub("</f>",RS)
    while ( match($0,/<f>[^\n]*\+[^\n]*\n/) ) {
        tgt = substr($0,RSTART,RLENGTH)
        gsub(/\+/,"*",tgt)
        $0 = substr($0,1,RSTART-1) tgt substr($0,RSTART+RLENGTH)
    }
    gsub(RS,"</f>")
    print
}' file
xx+xx <f>bar*bar*fo*bar*fe</f> yy+y <f>fee*bar</f> zz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...