【问题标题】:Bash output Regex for no-space string and slashes用于无空格字符串和斜杠的 Bash 输出正则表达式
【发布时间】:2018-01-20 03:21:59
【问题描述】:

这应该是一个相当简单的问题,答案也相对简单。

我正在尝试使用正则表达式来解析要稍微修改的输出。

我目前在脚本中将这段 bash 代码作为变量:

 $(/usr/bin/csvstat /home/icgwfrpa/Scripts/test.csv | sed -r 's/,/;/g' | sed ':a;N;$!ba;s/\n/ /g')

此变量返回为:

1. date     <type 'datetime.datetime'>  Nulls: False    Min: 2017-06-26 18:00:01 Max: 2017-07-14 12:00:01   Unique values: 425  
2. diskusage1   <type 'int'>    Nulls: False    Values: 26; 27; 28; 29   
3. partition1   <type 'unicode'>    Nulls: False    Values: /dev/mapper/rootvg-lv_root   
4. diskusage2   <type 'int'>    Nulls: False    Values: 30   
5. partition2   <type 'unicode'>    Nulls: False    Values: /dev/sda1  Row count: 425

太棒了。

我现在希望从该变量中删除所有内容,除了 /dev/mapper/rootvg-lv_root/dev/sda1 之类的字符串(或任何其他以 /dev/* 开头的类似内容,如果它显示在此输出中)。我不确定转义字符如何在带有斜杠的正则表达式中工作,因此不胜感激。

为了澄清,我想要的输出应该只是以 /dev/... 开头的字符串,直到空格,然后是空格或逗号,然后是序列中找到的下一个字符串。 谢谢。对不起,如果我的问题写得不好。

【问题讨论】:

  • pretty simple question with a relatively simple answer 所以可能已经被询问和回答了数千次。到目前为止,您尝试过什么?
  • 试试这个:\/dev(.*)\s
  • 这很容易通过正确的输入和所需的输出来回答。在给定的输入中不清楚,如果路径总是以点、空格或其他东西结尾。
  • 即使您有理由将您的 cmd 包含在 $(...) 中(例如 var=$(cmd...)`),包含它也会分散您的 Q 注意力。保持简单并编辑您的 Q 向我们展示您的示例输入,从而创建您所需的示例输出。祝你好运。
  • 如果你对 sed 有足够的了解,可以写':a;N;$!ba;s/\n/ /g',那么你不需要问这个问题。我怀疑现实是你从别人那里得到了那个脚本,不知道它是如何做的,也不知道现在如何根据你的需要来增强它,那么你为什么要使用它呢?不管它在做什么,有一个更简单、更清晰的 awk 脚本可以做同样的事情,你可以自己增强它,所以也许可以寻求帮助。

标签: regex bash unicode sed


【解决方案1】:

假设/dev/ 路径在一行中只出现一次...

$sed -r '/dev/!d;s#^.*(/dev/[^ ]*)\b.*#\1#' dev.txt /dev/mapper/rootvg-lv_root /dev/sda1
  • /dev/!d - 删除没有dev 的行
  • s#^.*(/dev/[^ ]*)\b.*#\1# 使用s### 而不是s////dev/[^ ]*(/dev/ 后跟非空格字符,然后\b 一个单词边界。替换为\1,第一个捕获组。
  • 使用sed -rsed -E 允许捕获组括号不转义。

【讨论】:

  • 它是 sed,而不是 awk。是的,大多数炮弹不需要爆炸逃逸。固定。
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
相关资源
最近更新 更多