在下面的 Bash 命令行中,当子字符串位于双引号之间时,我能够获取子字符串的索引。
text='123ABCabc((XYZabc((((((abc123(((123'
echo $text | awk '{ print index($0, "((((a" )}' # 20 is the result.
但是,在我的应用程序中,我不知道本例中“a”所在的位置是什么字符。因此,我认为我可以用接受“(”以外的任何字符的正则表达式替换“a”。我认为 /[^(}/ 将是我所需要的。但是,我一直无法获得 Awk 索引命令可使用任何形式的正则表达式来代替示例中的“((((a”。
更新: William Pursell 指出索引操作不接受正则表达式作为第二个操作数。
最终,我想要完成的是提取位于四个或多个“(”,后跟一个或多个“)”之后的子字符串。 Dennis Williamson 通过以下代码提供了解决方案:
echo 'dksjfkdj(((((((I-WANT-THIS-SUBSTRING)askdjflsdjf' |
mawk '{match($0,/\(\(\(\([^()]*\)/); s = substr($0,RSTART, RLENGTH); gsub(/[()]/, "", s); print s}'
感谢大家的帮助!
如果您想匹配四个或更多左括号以便找到匹配中另一个子字符串的开头,您实际上必须计算该值。
# Use GNU AWK to index the character after the end of a substring.
echo "$text" |
awk --re-interval 'match( $0, /\({4,}/ ) { print RSTART + RLENGTH }'
这应该为您提供括号序列后面的字符的正确起始索引,在本例中为 24。
获取一系列括号后第一个非左括号的位置:
$ echo "$text" | awk '{ print match($0, /\(\(\(\(([^(])/, arr); print arr[1, "start"]}'
20
24
这显示了子字符串“((([^(]”(20)的位置和括号后面的字符的位置(24)。
使用
match()
执行此操作的能力是 GNU (gawk
) 扩展。
编辑:
echo 'dksjfkdj(((((((I-WANT-THIS-SUBSTRING)askdjflsdjf' |
mawk '{match($0,/\(\(\(\([^()]*\)/); s = substr($0,RSTART, RLENGTH); gsub(/[()]/, "", s); print s}'
您想要
match
而不是索引。你需要逃避 (
。例如:
echo $text | awk '{ print match($0, /\(\(\(\([^(]/) }'
请注意,这不会给出字符串
((((
之后的字符的索引,而是给出第一个 (
的索引。