如何找到偶数个“后的第一个#?

问题描述 投票:0回答:1

读取以下格式的文本文件:

"bbbbbb", #"old", "uio",
" sds # sds", #"old2",
" sds # sds", " a # b",#"old2",
# ' sds # sds',

我正在尝试使用正则表达式获取 0-N 子字符串之后的第一个

#
的索引,但我无法找到正确的索引。

字符串示例为

" sds # sds", #"old2",

代码是:

while IFS= read -r rline; do
  echo $rline # prints a line from the file
  index=$(grep -P '(^[^\"]*(["][^\"]*["][^\"]*){0,}[^\"]*#)'  <<< "$rline" | awk '{print index($0, "#")-1}')
  echo "The index of the first not in string # is: $index"
done < file.txt

它不断返回索引 = 6 而不是 14

如果字符串是

" sds # sds", " a # b",#"old2",
应该给出 23 但也给出 6。

regex awk grep sh string-matching
1个回答
0
投票

您不需要在这里使用

grep | awk
。只需像这样单个
awk
就可以在任何 awk 上完成工作:

awk -F '"' '{
s = 0
for (i=1; i<=NF; ++i)
   if (i%2 && (p = index($i, "#"))) {
      print s+p
      next
   }
   else
      s += length($i)+1
}' file

11
15
24
1

PS:根据 awk 标准,这些索引从位置

1
开始。

© www.soinside.com 2019 - 2024. All rights reserved.