如何提取一对相同字符之间的文本?

如何提取一对相同字符之间的文本?

输入:

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

相关内容