如何在unix中提取两个单词之间的文本?

发布于 2024-11-09 19:58:37 字数 344 浏览 1 评论 0原文


上午
使用
基本
sed
表达式:-

sed -n "am/,/sed/p" 

获取“am”和“sed”之间的文本 它将输出“am \n using \n basic \n sed”。 但我真正的问题是字符串是否为:-

I
上午
使用
基本
grep
表达。

我在这句话中应用了上面的 sed 然后它给出了“am \n using \n basic \n grep \n expression” 它不应该给它。如何丢弃 如果没有匹配的话会输出吗?

有什么建议吗?

I
am
using
basic
sed
expression :-

sed -n "am/,/sed/p" 

to get the text between "am" and "sed"
which will output "am \n using \n basic \n sed".
But my real problem is if the string would be :-

I
am
using
basic
grep
expression.

I applied the above sed in this sentence
then it gave "am \n using \n basic \n grep \n expression"
which it should not give it. How to discard the
output if there would be no matching?

Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

变身佩奇 2024-11-16 19:58:37

问题中的命令(sed -n "/am/,/sed/p",注意添加的斜杠)意味着:

  • 查找包含字符串 am
  • 并打印 (p) 直到出现包含 sed 的行

因此它打印:

I am using basic grep expression

因为它包含 am。如果您要添加更多行,它们也会被打印,直到出现包含 sed 的行。

例如:

echo -e 'I am using basic grep expression.\nOne more line\nOne with sed\nOne without' | sed -n "/am/,/sed/p"

结果:

I am using basic grep expression.
One more line
One with sed

我认为 - 你想做的是这样的:

sed -n "s/.*\(am.*sed\).*/\1/p"

示例:

echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"

echo 'I am using basic sed expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"
sed -n "s/.*\(am.*sed\).*/\1/p"

The command in the question (sed -n "/am/,/sed/p", note the added slash) means:

  • Find a line containing the string am
  • and print (p) until a line containing sed occurs

Therefore it prints:

I am using basic grep expression

because it contains am. If you would add some more lines they will be printed, too, until a line containing sed occurs.

E.g.:

echo -e 'I am using basic grep expression.\nOne more line\nOne with sed\nOne without' | sed -n "/am/,/sed/p"

results in:

I am using basic grep expression.
One more line
One with sed

I think - what you want to do is something like that:

sed -n "s/.*\(am.*sed\).*/\1/p"

Example:

echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"

echo 'I am using basic sed expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"
sed -n "s/.*\(am.*sed\).*/\1/p"
爱的十字路口 2024-11-16 19:58:37

您必须使用稍微不同的 sed 命令,例如:

sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file

仅打印包含跨越多行的文本 amsed 的行。

You have to use slightly different sed command like:

sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file

To print ONLY lines that contain text am and sed spanned across multiple lines.

梨涡少年 2024-11-16 19:58:37

当使用 SED 时,这可以工作,但它是一个相当压倒性的语法......
如果您需要裁剪多行 (\n) 文本的一部分,您可能想使用 grep 尝试更简单的方法:

cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'

例如,我发现这是获取perforce变更列表描述的最简单方法(没有其余的CL信息):

p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'

注意,您可以使用<=和>=来包含或不包含输出中的开始/结束短语。

When Using SED this can work but it's quite an overwhelming syntax...
if you need to crop part of a multi-line (\n) text, you might want to try a simpler way using grep:

cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'

For example, I find this as the easiest way to grab perforce changelist description (without rest of CL info):

p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'

Note, you can play with the <= and >= to include or not include, the starting/ending phrases in the output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文