请解释这个命令是什么意思,对我来说真的是噩梦

new*_*bee -2 sed

sed -e"s@uid=[0-9]*(@@g"-e"s@).*\$@@g"
Run Code Online (Sandbox Code Playgroud)

我试过

s= 搜索

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

Kus*_*nda 5

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

假设第二个之前缺少的空格-e是一个错字,并给字符串更多的可读性,我们有

sed -e "s@uid=[0-9]*(@@g" -e "s@).*\$@@g"
Run Code Online (Sandbox Code Playgroud)

这与

sed -e "s/uid=[0-9]*(//g" -e "s/).*\$//g"
Run Code Online (Sandbox Code Playgroud)

使用单引号字符串,它变成

sed -e 's/uid=[0-9]*(//g' -e 's/).*$//g'
Run Code Online (Sandbox Code Playgroud)

(注意\$$),或

sed 's/uid=[0-9]*(//g; s/).*$//g'
Run Code Online (Sandbox Code Playgroud)

所以,这是sed用两个编辑表达式调用:

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

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

    uid=1(a) uid=2(b)
    
    Run Code Online (Sandbox Code Playgroud)

    被转化为

    a) b)
    
    Run Code Online (Sandbox Code Playgroud)
  2. s/).*$//g

    )通过不替换任何内容来删除从行中的第一个到行尾的所有内容。请注意,g这里不需要 ,因为表达式保证只匹配一次,因为用 锚定到行的末尾$

    我们上面的例子将从

    a) b)
    
    Run Code Online (Sandbox Code Playgroud)

    成刚

    a
    
    Run Code Online (Sandbox Code Playgroud)

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

再举一个例子,命令会改变

this is (line 1) of the file
hello world uid=09(a)  uid=213(b)
Run Code Online (Sandbox Code Playgroud)

进入

this is (line 1
hello world a
Run Code Online (Sandbox Code Playgroud)

如果不了解更多关于这个命令的上下文(你在哪里看到它,它该做什么等),很难说更多关于它或提出改进建议。


Tim*_*Tim 5

我怀疑它正在尝试使用包含以下内容的行/变量:

uid=500(约翰史密斯)

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

约翰·史密斯

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

当然,数字可以是任何数字,名称也可以是任何名称。