【问题标题】:unix sed command regular expressionunix sed 命令正则表达式
【发布时间】:2013-08-07 05:40:38
【问题描述】:

谁能解释一下正则表达式在 sed 替换命令中的工作原理。

$ cat path.txt
/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:
/opt/omni/lbin:/opt/omni/sbin:/root/bin

$ sed 's/\(\/[^:]*\).**/\1/g' path.txt
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin

从上面的 sed 命令中,他们使用了反向引用和保存操作符的概念。 谁能解释一下正则表达式,尤其是 /[^:]* 如何在替换命令中工作以仅获取每行中的第一条路径。

【问题讨论】:

  • sed 's/:.*//' path.txt 将是一个更简单的命令。

标签: regex unix sed command


【解决方案1】:

我认为你在 sed 代码中多写了一个星号 *,所以应该是这样的:

$ sed 's/\(\/[^:]*\).*/\1/g' file
/usr/kbos/bin
/usr/local/sbin
/opt/omni/lbin

更改分隔符将有助于更好地理解它:

sed 's#\(/[^:]*\).*#\1#g'

s#something#otherthing#g 是一个基本的sed 命令,用于查找something 并将其更改为整个文件中的otherthing。

如果您执行s#(something)#\1#g,那么您“保存”该something,然后您可以使用\1 将其打印回来。

因此,它正在做的是得到一个像/[^:]* 这样的模式,然后 print 又回来了。 /[^:]* 表示 / and then every char except :。所以它会得到/ + 所有字符串,直到找到分号:。它将存储那段字符串,然后将其打印回来。

小例子:

# get every char
$ echo "hello123bye" | sed 's#\([a-z]*\).*#\1#g'
hello

# get everything until it finds the number 3
$ echo "hello123bye" | sed 's#\([^3]*\).*#\1#g'
hello12

【讨论】:

  • 很高兴阅读,@user2576028!由于您是新来的,请记住,如果您的问题已经解决,您可以将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking!
【解决方案2】:
[^:]*

在正则表达式中将匹配除: 之外的所有字符,因此它会匹配到以下内容:

/usr/kbos/bin

它也会匹配这些,

/usr/local/bin
/usr/jbin
/usr/bin
/usr/sas/bin

因为,这些都包含字符,而不是:

.* 匹配任意字符,零次或多次。

因此,这个正则表达式 [^:]*.* 将匹配所有这些表达式:

/usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin
/usr/jbin:/usr/bin:/usr/sas/bin
/usr/bin:/usr/sas/bin

但是,您只能获得第一个字段(即/usr/kbos/bin,通过在sed 中使用反向引用),因为正则表达式输出找到的最长可能匹配项。

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 2013-07-07
    • 2020-05-21
    • 1970-01-01
    • 2021-12-19
    • 2018-02-27
    • 2011-06-06
    相关资源
    最近更新 更多