`someString` complete(1)
我需要在反引号之间的“someString”。在下面尝试过但不起作用。
cat file.txt | grep '\`.*\`'
答案1
答案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