Как использовать регулярные выражения в файле оболочки (.sh) для захвата '\' и новой строки (перевод строки)? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь перехватить '\' и перевод строки в файл оболочки (.sh).Я пробовал на сайте: https://regexr.com/ и это работает.Но похоже, что путь не такой, как в файле оболочки.

Вот цель, и я хочу получить эти три группы совпадений :

 some dummy code in front of
blablabla
 CE3( Match_Group_1, \(some space may right after this backslash)
      Match_Group_2, \(some space may right after this backslash)
      Match_Group_3,    \(some space may right after this backslash)
      abcabc1234,   \(some space may right after this backslash)
    abcd12345      )

blablabla
     blablabla

Myрегулярное выражение в https://regexr.com/: '\ s *' может захватывать пробел, табуляцию и перевод строки.Получите эти группы совпадений с помощью (\ w +)

 \s*\(\s*(\w+)\s*,\s*\\\s*(\w+)\s*,\s*\\\s*(\w+)

Мое регулярное выражение в файле оболочки для сопоставления и печати: не удалось получить эти три сопоставимые группы

 awk_cmd="awk 'match(\$0, /(${i})\\s*\(\\s*(\\w+)\\s*,\\s*\\\\s*(\\w+)\\s*,\\s*\\\\s*(\\w+)/, g) {print FILENAME \",\" NR \",\" g[1] \",\" g[3] \",\" g[4]}'"

Может ли кто-нибудь мне помочь?большое спасибо

1 Ответ

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

Это то, что вы пытаетесь сделать?

$ awk_cmd() {
    awk -v RS='^$' -v OFS='","' '
        match($0,/\s*\(\s*(\w+)\s*,\s*\\\s*(\w+)\s*,\s*\\\s*(\w+)/,g) {
            print "\"" FILENAME, NR, g[1], g[2], g[3] "\""
        }
    ' "$@"
}

$ awk_cmd file
"file","1","Match_Group_1","Match_Group_2","Match_Group_3"

$ cat file | awk_cmd
"-","1","Match_Group_1","Match_Group_2","Match_Group_3"

Поскольку ваше регулярное выражение должно занимать несколько строк, неясно, какое значение вы ожидаете, что NR будет иметь.Выше я рассматриваю весь входной файл как одну запись, так что NR всегда будет просто 1. Если вы пытаетесь напечатать номер строки, где начинается строка, соответствующая регулярному выражению, то это будет:

$ awk_cmd() {
    awk -v RS='^$' -v OFS='","' '
        match($0,/(.*)\s*\(\s*(\w+)\s*,\s*\\\s*(\w+)\s*,\s*\\\s*(\w+)/,g) {
            nr = gsub(/\n/,"&",g[1]) + 1
            print "\"" FILENAME, nr, g[2], g[3], g[4] "\""
        }
    ' "$@"
}

$ awk_cmd file
"file","3","Match_Group_1","Match_Group_2","Match_Group_3"

Выше используется GNU awk для RS с несколькими символами и 3-й аргумент для match () и \s и \w сокращение для [[:space:]] и [[:alnum:]_].

...