请解释一下这个命令的含义,这对我来说真是噩梦

请解释一下这个命令的含义,这对我来说真是噩梦
sed -e"s@uid=[0-9]*(@@g"-e"s@).*\$@@g"

我试过

s= 搜索

[0-9]*= 仅搜索以 0-9 开头的数字

答案1

您的sed命令无缘无故地用作(替换,而不是“搜索”)命令@的分隔符s///,这使得它难以阅读。

假设第二个之前缺少的空格-e是一个拼写错误,并为字符串提供更多的空间以提高可读性,我们有

sed -e "s@uid=[0-9]*(@@g" -e "s@).*\$@@g"

这与

sed -e "s/uid=[0-9]*(//g" -e "s/).*\$//g"

带有单引号的字符串,变成

sed -e 's/uid=[0-9]*(//g' -e 's/).*$//g'

(注\$$),或

sed 's/uid=[0-9]*(//g; s/).*$//g'

因此,这是sed使用两个编辑表达式进行调用:

  1. s/uid=[0-9]*(//g

    这将替换任何uid=后跟任意数量数字的子字符串,并且将 a替换(为空(它会删除这些字符串)。尾随g使其对行上的所有非重叠匹配项执行此操作,而不仅仅是第一个匹配项,以便

    uid=1(a) uid=2(b)
    

    被转化为

    a) b)
    
  2. s/).*$//g

    这会)通过将其替换为空来删除从行首到行尾的所有内容。请注意,g此处不需要,因为由于用 锚定到行尾,因此保证表达式仅匹配一次$

    我们上面的例子将由

    a) b)
    

    进入刚刚

    a
    

    这让我相信g每个命令中的尾随都是在没有经过太多事后添加的情况下添加的(绝对不需要第二个命令,并且第二个表达式只是删除第一个命令中的所有内容))使得第一的 g无效,除非您正在处理具有不平衡括号的数据)。这些可能应该被删除。

作为进一步的示例,命令将更改

this is (line 1) of the file
hello world uid=09(a)  uid=213(b)

进入

this is (line 1
hello world a

不知道更多关于这个命令的上下文(你在哪里看到它,它是什么)应该做等),很难对此说更多或提出改进建议。

答案2

我怀疑它试图获取包含以下内容的行/变量:

uid=500(约翰·史密斯)

...并将其简化为如下所示:

约翰·史密斯

它试图通过删除括号外的所有内容以及括号本身来从括号内提取真实/用户名。

当然,号码可以是任何号码,名称可以是任何名称。

相关内容