【问题标题】:Getting delimited substrings using sed+regexp使用 sed+regexp 获取分隔子字符串
【发布时间】:2019-07-01 12:52:25
【问题描述】:

我正在尝试使用 sed 和正则表达式来获取子字符串。我想得到由“:”分隔的第一个和第二个“字段”。

为了获取第一个字段,我使用了以下命令,但不知道如何获取第二个字段。

用于获取第一个字段的命令:

sed -r -n '1,2 s/([^:]+).*/\1/p' /etc/passwd

输入文件(示例):

root:x:0:0:root:/root:/bin/bash   
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

命令结果:

root   
daemon

但我尝试获取第一个(“root”)和第二个(“x”)字段(仅基于文件第一行的示例),但我没有成功。

我试过了:

sed -r -n '1,2 s/([^:]+).*([^:]+).*/\1 \2/p' /etc/passwd

命令结果:

root h   
daemon n

想要的结果:

root x   
daemon x

【问题讨论】:

  • 使用 awk:awk -F ':' '{print $1,$2}' file

标签: regex sed substring


【解决方案1】:

sed 使用greedy match。在

sed -r -n '1,2 s/([^:]+).*([^:]+).*/\1 \2/p' /etc/passwd
                        ^^

.* 匹配尽可能多的字符。你需要

sed -r -n '1,2 s/([^:]+):([^:]+).*/\1 \2/p' /etc/passwd
                        ^

演示http://ideone.com/wjL7Za.

顺便说一句,更简单的方法是使用cut

cut -d ":" -f 1,2 --output-delimiter=' ' /etc/passwd

演示http://ideone.com/stJdSy.

【讨论】:

  • 太棒了!很好的解释。网站的链接非常棒。谢谢
【解决方案2】:

另一个返回期望结果的表达式是:

([a-z]+):([a-z]+).*

RegEx Demo


sed -r -n '1,2 s/([^:]+):([^:]+).*/\1 \2/p'

Sed Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多