grep 反引号之间的字符串

grep 反引号之间的字符串
`someString` complete(1)

我需要在反引号之间的“someString”。在下面尝试过但不起作用。

cat file.txt | grep '\`.*\`'

答案1

通过 GNUgrep支持聚合酶链式反应扩大:

grep -Po '(?<=`)[^`]*(?=`)' infile

或返回 ac仅例如`a`b`c`你会做:

grep -Po '(?<=`)[^`]+(?=`(?:[^`]*`[^`]*`)*[^`]*$)'

返回一对反引号之间的所有内容。

尖端:
(?<=...)积极的向后看
(?=...):积极的前瞻性
(?:...):非捕获组
[^`]*:除反引号之外的任何字符`


awk

awk -F'`' '{ for(i=2; i<=NF; i+=2) print $i; }' infile

答案2

使用cut

cut -d'`' -f2  < file.txt

答案3

grep,默认情况下,返回线匹配给定的表达式。因此,您的表达式将返回与表达式匹配的整行。

grep我们可以使用sed来编辑包含我们要查找的字符串的行,而不是使用。

假设该行中只有一个反引号字符串,我们可以砍掉第一个反引号之前和第二个反引号之后的所有内容:

$ sed 's/[^`]*`//; s/`.*//' <file.txt
someString

由于反引号在正则表达式中并不特殊,因此不需要对其进行转义。反引号对于 shell 来说是特殊的(它引入了命令替换),但由于我们使用单引号字符串,因此 shell 不会将其视为特殊的。


还可以匹配捕获组中反引号之间的字符串(\(...\)in sed),然后用它替换整行(但就我个人而言,我认为这会使阅读变得有点困难):

$ sed 's/[^`]*`\([^`]*\)`.*/\1/' <file.txt
someString

上述表达式中所有使用 的[^`]意思是“某个字符,不是反引号”。


一种完全不同的方法是首先删除所有反引号,然后删除行中空白处之前的所有内容:

$ tr -d '`' <file.txt | sed 's/[[:blank:]].*//'
someString

字符[[:blank:]]类匹配单个空格或制表符。

这显然假设反引号字符串是一个没有嵌入空白字符的单词,并且它首先出现在该行上,如问题中的示例所示。


回到grep...如果您grep有非标准(但通常实现)-o选项来仅返回与每行表达式匹配的位,那么我们可以这样使用:

$ grep -o '`[^`]*`' <file.txt | tr -d '`'
someString

首先得到反引号字符串,然后删除反引号。sed如果每行有多个反引号字符串,则这种方法的行为会有所不同。在这种情况下,这会给你返回每个这样的字符串在其自己的一行上,而sed变体只会给你返回第一的反引号字符串。

答案4

命令1

awk '{for(i=1;i<=NF;i++){if($i ~ /^`.*`/){gsub("`","",$0);print $i}}}' filename


Above command tested and worked fine

相关内容