【问题标题】:Use Stream Editor (sed) to Obtain Substring within Comma-Delimited Lines使用流编辑器 (sed) 获取逗号分隔行内的子字符串
【发布时间】:2016-02-14 01:21:09
【问题描述】:

所以我今天大部分时间都在尝试使用 sed 在以下行中获取用户名。

nesomplefore,Aip1seshoh,female,Ms.,Siri,Rosberg,870 Maxwell Farm Road,Fredericksburg,VA,22408,,540-222-0054,3/24/48,Aries,Cartographer

我已经使用 grep 成功完成了它,因为我设法从此处的另一篇文章中复制和粘贴,但我对 sed 没有任何运气。

谁能解释一下 grep 正则表达式以及如何使用 sed 来做同样的事情?

grep -oP "^([^,]*\,){0}\K[^,]*"

我希望能够通过管道传输正则表达式的结果,以便动态添加大量用户。并且请不要向我推荐这个link,因为我尝试按照 sed 和其他人的解释进行操作,但没有任何理解。

【问题讨论】:

    标签: regex awk sed grep delimiter


    【解决方案1】:

    当然。如果我们将您的示例行放入名为“test.txt”的文件中,则以下内容可以正常工作:

    sed -e 's/^\([^,]*\),.*/\1/' test.txt
    

    它是这样说的:

    s - 搜索/替换

    /^\([^,,]*\),.*/ - 从行首 (^) 搜索,为任意数量的非逗号字符 ([^,]*) 创建反向引用(转义括号)。 ,.* 在关闭后引用标记之外捕获该行的其余部分。

    /\1/ - 将匹配的字符串替换为存储的反向引用(用户名)

    【讨论】:

    • 所以从你写的我明白,每当我有两个正斜杠时,我都会创建一个“引用”,然后我可以调用它们中的内容?是否可以有多个反向引用,然后说 /\1/\2/'?我猜第二个逗号(在转义的右括号之后的那个)你说的是“从行的开头匹配不包含逗号的所有内容,但不包括逗号?”另外,这对我来说真的更重要,如果我真的不关心线路的其余部分,为什么我需要 .* ? @大卫霍尔泽
    • 不完全。正斜杠用于分隔正则表达式。括号(已转义)正在创建引用。第一对允许您使用 \1,第二个 \2 等,以便您可以在替换部分中引用它们(向后引用.. 向后引用)。
    • 我们使用的sed命令一般是s/expression/replacement/modifiers
    • 所以我在做curl http://users.cis.fiu.edu/~ggome002/cts4348/accounts/users45.csv | tac | tac | head -3 | user=$(sed -n 's/^\([^,]*\),.*/\1/') | useradd $user 但我做错了什么,因为似乎什么都没有发生。即使使用 sed p 修饰符。对不起,我是个新手。
    • 哦,来吧,即使是新手也一定想知道他们为什么要这样做tac | tac。阅读手册页,谷歌搜索,或者,天堂禁止,拿起一本书!
    【解决方案2】:

    您没有告诉我们“用户名”出现在您的示例输入中的哪个位置,也没有向我们展示您的预期输出,所以我不知道您想要哪个字段但您想要的工具是cut,而不是sed:

    $ echo 'nesomplefore,Aip1seshoh,female' | cut -d, -f1
    nesomplefore
    
    $ echo 'nesomplefore,Aip1seshoh,female' | cut -d, -f2
    Aip1seshoh
    

    【讨论】:

      【解决方案3】:

      这听起来像是一个硬件作业,请注意上课,因为我们不是你的导师。也不要使用特定的文件名和位置,因为它会带来安全问题......您将在课堂上学习。

      【讨论】:

      • 如果我不花一整天的时间来弄清楚,我就不会问这个问题。不仅如此,课堂上提到的内容与我试图解决问题的方式并不相似。我可以轻松地采取简单的方法并编写一些脚本来做同样的事情,但我更愿意学习命令、它们的选项以及它们如何相互连接,因为至少对我来说,它对增长更有利而不是相反拥有大量文件来完成一系列管道可以做的事情。如果你注意到,我在这里没有太多问题。感谢您的意见。
      猜你喜欢
      • 2023-03-06
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2013-04-21
      • 1970-01-01
      • 2015-02-08
      • 2017-06-06
      相关资源
      最近更新 更多