Linux Bash regexp查找字符串的一部分

Linux Bash regexp查找字符串的一部分,linux,bash,Linux,Bash,我有一个类似于setSuperValue('sdfsdfd')的字符串,我需要从此行获取'sdfsdfd'值。怎么做呢 首先,我通过setSuperValue查找行,然后只获取包含目标内容的字符串-setSuperValue('sdfsdfd')。如何构建regexp以从此行获取sdfsdfd grep setSuperValue myfile.txt | grep -o "'. *'" | tr -d "'" grep-o将返回所有以单个“开头,以另一个”结尾的文本,包括两个引号。然后使

我有一个类似于
setSuperValue('sdfsdfd')
的字符串,我需要从此行获取
'sdfsdfd'
值。怎么做呢

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

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}'
这将分割单引号所在的行,并返回第二个值,即您要查找的值

这应该对你有帮助

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}'
这将分割单引号所在的行,并返回第二个值,即您要查找的值

这应该对你有帮助

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}'
这将分割单引号所在的行,并返回第二个值,即您要查找的值

这应该对你有帮助

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

这将分割单引号所在的行,并返回第二个值,即您要查找的值

您可以使用参数扩展/子字符串删除来解析行中的值,而无需依赖任何外部工具:

#!/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

您可以使用参数扩展/子字符串删除来分析行中的值,而无需依赖任何外部工具:

#!/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

您可以使用参数扩展/子字符串删除来分析行中的值,而无需依赖任何外部工具:

#!/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

您可以使用参数扩展/子字符串删除来分析行中的值,而无需依赖任何外部工具:

#!/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

通常,要在多行数据中定位字符串,外部实用程序将比Bash中的行循环快得多。

在您的特定情况下,单个
sed
命令将执行您想要的操作:

sed -n -r "s/^.*setSuperValue\('([^']+)'\).*$/\1/p" file
  • 扩展(
    -r
    )正则表达式
    ^.*setSuperValue\(“([^']+)”).$
    将包含
    setSuperValue(“…”)
    的任何行作为一个整体进行匹配,捕获捕获组
    \1
    中的任何
    ..
    ,用该行替换输入行,并打印结果。
    • 由于选项
      -n
      ,因此不会打印其他内容
    • (…)
      内移动打开和关闭
      ,以将其包含在捕获的值中
注意:如果输入文件包含多行
setSuperValue(“…”)
行,则命令将打印每个匹配项;无论哪种方式,该命令都将处理所有行。
要仅打印第一个匹配项并在之后立即停止处理,请按如下方式修改命令:

sed -n -r "/^.*setSuperValue\('([^']+)'\).*$/ {s//\1/;p;q}" file
  • /…/
    仅匹配包含
    setSuperValue(“…”)
    的行,导致仅对匹配行执行以下
    {…}
    • s//
      -即,不指定正则表达式-隐式地基于与当前行匹配的同一正则表达式执行替换
      p
      打印结果,
      q
      完全退出处理,这意味着一旦找到第一个匹配项,处理就停止

如果您已经通过其他方法找到了感兴趣的行,并且正在寻找基于正则表达式提取子字符串的纯Bash方法,请使用,它通过特殊的
${Bash_REMATCH[@]}
数组变量支持扩展正则表达式和捕获组:

$ sampleLine="... setSuperValue('sdfsdfd') ..."
$ [[ $sampleLine =~ "setSuperValue('"([^\']+)"')" ]] && echo "${BASH_REMATCH[1]}"
sdfsdfd

注意仔细地引用了正则表达式中应该按字面理解的部分,以及
${BASH_REMATCH[1]}
如何引用第一个(也是唯一一个)捕获的组。

一般来说,要在多行数据中定位字符串,外部实用程序将比在BASH中循环行快得多。

在您的特定情况下,单个
sed
命令将执行您想要的操作:

sed -n -r "s/^.*setSuperValue\('([^']+)'\).*$/\1/p" file
  • 扩展(
    -r
    )正则表达式
    ^.*setSuperValue\(“([^']+)”).$
    将包含
    setSuperValue(“…”)
    的任何行作为一个整体进行匹配,捕获捕获组
    \1
    中的任何
    ..
    ,用该行替换输入行,并打印结果。
    • 由于选项
      -n
      ,因此不会打印其他内容
    • (…)
      内移动打开和关闭
      ,以将其包含在捕获的值中
注意:如果输入文件包含多行
setSuperValue(“…”)
行,则命令将打印每个匹配项;无论哪种方式,该命令都将处理所有行。
要仅打印第一个匹配项并在之后立即停止处理,请按如下方式修改命令:

sed -n -r "/^.*setSuperValue\('([^']+)'\).*$/ {s//\1/;p;q}" file
  • /…/
    仅匹配包含
    setSuperValue(“…”)
    的行,导致仅对匹配行执行以下
    {…}
    • s/
      -即,不指定正则表达式-隐式执行