我有一个类似setSuperValue('sdfsdfd')
的字符串,我需要从此行获取'sdfsdfd'
值。有什么办法呢?
首先,我按setSuperValue
查找行,然后只获取目标内容的字符串 - setSuperValue('sdfsdfd')
。如何构建regexp以从此行获取sdfsdfd
?
答案 0 :(得分:2)
这应该可以帮到你
grep setSuperValue myfile.txt | grep -o "'. *'" | tr -d "'"
grep -o
将返回以单个'开头的所有文字。并以另一个'结尾,包括两个引号。然后使用tr
删除引号。
您也可以使用cut
:
grep setSuperValue myfile.txt | cut -d"'" -f2
或awk
:
grep setSuperValue myfile.txt | awk -F "'" '{print $2}'
这将分割单引号所在的行并返回第二个值,这就是您要查找的内容。
答案 1 :(得分:1)
通常,要在多行数据中定位字符串,外部实用程序将比在Bash中循环遍历更快。
在您的特定情况下,单个sed
命令将执行您想要的操作:
sed -n -r "s/^.*setSuperValue\('([^']+)'\).*$/\1/p" file
-r
)正则表达式^.*setSuperValue\('([^']+)'\).*$
匹配任何包含setSuperValue('...')
整行的行,捕获捕获组...
中的\1
,替换输入行,并打印p
结果。
-n
,不会打印任何其他内容。'
内移动开始和结束(...)
,将其包含在捕获的值中。注意:如果输入文件包含多个 setSuperValue('...')
行,则该命令将打印每个匹配;无论哪种方式,该命令都将处理所有行
要仅打印第一个匹配并在之后立即停止处理,请按如下所示修改命令:
sed -n -r "/^.*setSuperValue\('([^']+)'\).*$/ {s//\1/;p;q}" file
/.../
只有匹配包含setSuperValue('...')
的行,导致以下{...}
仅针对匹配行执行。
s//
- 即,未指定正则表达式 - 根据与手头的行匹配的相同正则表达式隐式执行替换; p
打印结果,q
完全退出处理,这意味着一旦找到第一个匹配项,处理就会停止。如果您已经通过其他方法找到了感兴趣的行,并且正在寻找基于正则表达式提取子字符串的纯Bash方法,请使用支持=~
, Bash's regex-matching operator >扩展正则表达式和捕获组通过特殊的${BASH_REMATCH[@]}
数组变量:
$ sampleLine="... setSuperValue('sdfsdfd') ..."
$ [[ $sampleLine =~ "setSuperValue('"([^\']+)"')" ]] && echo "${BASH_REMATCH[1]}"
sdfsdfd
请注意仔细引用应该采用字面的正则表达式部分,以及${BASH_REMATCH[1]}
如何引用第一个(也是唯一的)捕获的组。
答案 2 :(得分:0)
您可以使用参数扩展/子字符串删除解析该行中的值,而无需依赖任何外部工具:
#!/bin/bash
while read -r line; do
value=$(expr "$line" : ".*setSuperValue('\(.*\)')")
if [ "x$value" != "x" ]; then
printf "value : %s\n" "$value"
fi
done <"$1"
测试输入
$ cat dat/supervalue.txt
setSuperValue('sdfsdfd')
something else
setSuperValue('sdfsdfd')
something else
setSuperValue('sdfsdfd')
something else
示例输出
$ bash parsevalue.sh dat/supervalue.txt
value : sdfsdfd
value : sdfsdfd
value : sdfsdfd