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/