繁体   English   中英

用 SED 提取 substring

[英]extract substring with SED

我有下一个字符串:例如:

     input1 = abc-def-ghi-jkl

     input2 = mno-pqr-stu-vwy

我想提取“-”之间的第一个词

对于我想获得的第一个字符串: def

如果输入是第二个字符串,我想得到: pqr

我想使用命令 SED ,你能帮帮我吗?

利用

sed 's,^[^-]*-\([^-]*\).*,\1,' file

第一个-之后的字符串将被捕获到第二个-并且 rest 将被匹配,然后匹配的行将替换为组文本。

使用bash

var='input1 = abc-def-ghi-jkl'
var=${var#*-}      # remove shortest prefix `*-`, this removes `input1 = abc-`
echo "${var%%-*}"  # remove longest suffix `-*`, this removes `-ghi-jkl`

或使用awk

awk -F'-' '{print $2}' <<<'input1 = abc-def-ghi-jkl'

使用-作为输入字段分隔符并打印第二个字段。


或使用cut

cut -d'-' -f2 <<<'input1 = abc-def-ghi-jkl'

当您想使用sed时,您可以选择以下解决方案

# Double processing
echo "$input1" | sed 's/[^-]*-//;s/-.*//'
# Normal approach
echo "$input1" | sed -r 's/^[^-]*-([^-]*)|-.*)/\1/g'
# Funny alternative
echo "$input1" | sed -r 's/(^[^-]*-|-.*)//g'

明显的“外部”工具将被cut 您还可以查看 Bash 内置解决方案,例如

[[ ${input1} =~ ([^-]*)-([^-]*) ]] && printf %s "${BASH_REMATCH[2]}"

grep解决方案(在我看来,这是最自然的方法,因为您只是想找到与正则表达式的匹配项 - 您不想编辑任何内容,因此不需要更高级的命令sed

grep -oP '^[^-]*-\K[^-]*(?=-)' << EOF
> abc-qrs-bobo-the-clown
> 123-45-6789
> blah-blah-blah
> no dashes here
> mahi-mahi
> EOF

Output

qrs
45
blah

解释

首先查看输入,这里包含的完整性是一个heredoc (您更有可能将您的文件命名为grep的最后一个参数。)该解决方案要求字符串中至少存在两个破折号; 特别是对于mahi-mahi ,它将找不到匹配项。 如果您想找到第二个mahi作为匹配项,您可以删除正则表达式末尾的前瞻断言(见下文)。

正则表达式就是这样做的。 首先注意命令选项: -o只返回匹配的 substring,而不是整行; -P使用 Perl 扩展。 然后,正则表达式:从行首开始( ^ ); 查找零个或多个非破折号字符,后跟破折号,然后 ( \K ) 从找到的与模式匹配的子字符串中丢弃所需匹配的这部分。 然后再次查找零个或多个非破折号字符 - 这将由命令返回。 最后,要求在此模式后使用破折号,但不要将其包含在匹配项中。 这是通过前瞻(由(?=... )标记)完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM