【问题标题】:sed combine two search and replace [duplicate]sed结合了两个搜索和替换[重复]
【发布时间】:2015-11-13 06:46:35
【问题描述】:

我目前正在制作一个命令,该命令从 iwconfig 中获取信息,grep 的某一行,剪切一部分,然后运行两个 sed 搜索和替换功能,以便我可以将其输出到其他地方。目前命令如下:

iwconfig wlan0 | grep ESSID | cut -c32-50 | sed 's/ //g' | sed 's/"//g'

输出按预期输出,删除空格和“,但我想知道是否有办法将我的搜索和替换压缩成一个命令,最好是使用和/或运算符。有没有办法这样做?如果是这样,sed 命令将如何编写?谢谢!

【问题讨论】:

  • iwconfig wlan0 的输出添加到您的问题和所需的输出中。
  • sed 's/[ "]//g' — 不使用和/或运算符,但不需要。
  • @JonathanLeffler - 如果我们想要更简单的解决方案:tr -d ' "'

标签: bash sed


【解决方案1】:

正则表达式1\|正则表达式2 匹配 regexp1 或 regexp2。使用括号来使用复杂的替代正则表达式。匹配过程从左到右依次尝试每个备选方案,并使用第一个成功的备选方案。它是一个 GNU 扩展。

sed 's/ \|"//g'

应该有效

【讨论】:

    【解决方案2】:

    您还没有显示iwconfig 在您的情况下产生了什么,但是,在我的系统上,以下成功提取了 ESSID:

    iwconfig wlan0 | sed -n 's/.*ESSID://p'
    

    如果确实有空格和引号需要去掉,那么试试:

    iwconfig wlan0 | sed -n 's/[ "]//g; s/.*ESSID://p'
    

    工作原理

    • -n

      这告诉 sed 除非我们明确要求,否则不要打印任何行。

    • s/[ "]//g

      这会删除空格和双引号。

    • s/.*ESSID://p

      这将删除直到 ESSID: 并包括在内的所有内容。如果进行了替换,这意味着该行包含ESSID:,则打印它。

    示例

    $ echo '"something" ESSID:"my id"' | sed -n 's/[ "]//g; s/.*ESSID://p'
    myid
    

    【讨论】:

    • ESSID 正是我要提取的。我运行了你的两个命令并且它们运行良好,但是你提供的第二个命令没有删除“的”。
    • @barefly 嗯。这很好奇。我刚刚添加了一个示例,该示例显示了删除空格和引号的命令。是否会复制并粘贴该代码并查看它是否为您产生相同的输出?
    • 现在可以使用了。我认为您的第一个命令缺少 s/[ "]//g 末尾的 /g。至少这是我的 bash 历史告诉我的。
    • @barefly 非常好。问题解决了。而且,是的,你是对的:我的初稿缺少g
    【解决方案3】:

    使用 GNU awk 进行 gensub():

    iwconfig wlan0 | awk '/ESSID/{print gensub(/[ "]/,"","g",substr($0,32,19))}'
    

    可能有一个更简单的方法,但没有示例输入/输出(即来自iwconfig 的输出以及您希望脚本输出的内容)我不会猜...

    【讨论】:

      猜你喜欢
      • 2018-12-22
      • 2014-09-13
      • 2019-02-02
      • 2012-05-05
      • 2015-01-30
      • 2010-11-05
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多