使用Bash regexp查找字符串的一部分

时间:2015-10-15 16:08:57

标签: linux bash

我有一个类似setSuperValue('sdfsdfd')的字符串,我需要从此行获取'sdfsdfd'值。有什么办法呢?

首先,我按setSuperValue查找行,然后只获取目标内容的字符串 - setSuperValue('sdfsdfd')。如何构建regexp以从此行获取sdfsdfd

3 个答案:

答案 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