gpt4 book ai didi

regex - 如何在 shell 文件 (.sh) 中使用正则表达式来捕获 '\' 和换行符 (linefeed)?

转载 作者:行者123 更新时间:2023-11-29 09:32:28 25 4
gpt4 key购买 nike

我正在尝试在 shell 文件 (.sh) 中捕获“\”和换行符。我在网站上试过:https://regexr.com/它有效。但是好像和shell文件里的方式不太一样。

这是目标,我想得到这三个匹配组:

 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

我的正则表达式在 https://regexr.com/ :'\s*' 可以捕获空格、制表符和换行符。通过 (\w+)

获取那些匹配组
 \s*\(\s*(\w+)\s*,\s*\\\s*(\w+)\s*,\s*\\\s*(\w+)

我在 shell 文件中的正则表达式进行匹配然后打印:它未能获得这三个匹配组

 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]}'"

谁能帮帮我非常感谢

最佳答案

这是你想要做的吗?

$ 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 个参数匹配 () 和 \s\w [[:space 的简写:]][[:alnum:]_]

关于regex - 如何在 shell 文件 (.sh) 中使用正则表达式来捕获 '\' 和换行符 (linefeed)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com