![如何提取一对相同字符之间的文本?](https://linux22.com/image/1126645/%E5%A6%82%E4%BD%95%E6%8F%90%E5%8F%96%E4%B8%80%E5%AF%B9%E7%9B%B8%E5%90%8C%E5%AD%97%E7%AC%A6%E4%B9%8B%E9%97%B4%E7%9A%84%E6%96%87%E6%9C%AC%EF%BC%9F.png)
输入:
blahŤfoobar1Ťblah
期望输出:
foobar1
我想要获取两个“Ť”字符之间的文本。
假设总会有 0 或 2 个“Ť”字符,以使事情变得简单。
我尝试了以下操作,但我不知道如何让它知道发生了哪种情况:
echo "blahŤfoobar1Ťblah" | sed -n '/Ť/,/Ť/p'
答案1
您可以使用剪切命令。
提取第二个模式:
echo "blah@foobar1@blah" | cut -f2 -d"@"
提取第二和第三个模式:
echo "blah@foobar1@blah" | cut -f2,3 -d"@"
从第二个模式开始提取
echo "blah@foobar1@blah" | cut -f2- -d"@"
编辑:由于问题已标记为 awk。这是一个 awk 解决方案。
echo "blah@foobar1@blah" | awk -F'@' {'print $2'}
答案2
awk
似乎是解决这个问题最容易使用的方法:
$ echo "blahŤfoobar1Ťblah" | awk -FŤ '{ print $2 }'
foobar1
答案3
awk
喜欢这些东西:
$ awk -F"Ť" '{print $2}' <<< "blahŤfoobar1Ťblah"
foobar1
通过使用Ť
作为字段分隔符,我们确保在第二个块中捕获所需的文本。如果我们想Ť
在给定行中未找到任何内容时跳过处理,我们可以使用awk -F"Ť" 'NF>1{print $2}'
。
关于您尝试不起作用:通过说sed -n '/start/,/end/p'
您正在打印包含 的行start
和包含 的行之间的行(和包含 ) end
。 因此,如果您想要这样做,它会起作用。
例子
鉴于此文件:
$ cat a
starting...
Ť
foobar1
hello
Ť
i am here
输出为:
$ sed -n '/Ť/,/Ť/p' a
Ť
foobar1
hello
Ť
答案4
您还可以使用以下perl
方法来提取文本:
$ echo 'blahŤfoobar1Ťblah' | perl -FŤ -ane 'print"$F[1]\n"'
foobar1
这里的关键是使用-F
选项来设置分隔符。
使用正则表达式的另一种方法:
$ echo "blahŤfoobar1Ťblah" | perl -pe 's/.*Ť(.*)Ť.*/$1/'
foobar1