[英]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.