【问题标题】:bash string manipulation using sed/regex使用 sed/regex 进行 bash 字符串操作
【发布时间】:2014-08-02 05:43:08
【问题描述】:

通过 bash,我试图从文件中提取部分行。

目前我正在使用两个 sed 命令,如下所示:

sed -n -e "s/^abc=//p" file | sed -n -e "s/\.//gp"

它可以接收abc=1.2.3 并吐出123。这让我想到......我可以通过一个命令调用来实现这一点吗?就像我想在文件中找到与abc=<digit1>\.<digit2>\.<digit3> 匹配的所有字符串并吐出<digit1><digit2><digit3>

编辑:

澄清一下,我希望它只打印出匹配的行。例如,如果我有以下文件:

1.2.3.4
abc=quack
qtip=1.2.3
abc=1.2.3
abc = 4.5.6

运行命令应该只打印123

【问题讨论】:

    标签: regex bash sed


    【解决方案1】:

    您可以使用awk 代替.abc= 之后的部分中删除:

    awk -F= '$1=="abc"{gsub(/\./, "", $2); print $2}' file
    

    【讨论】:

      【解决方案2】:

      你可以试试下面的 GNU sed 命令是字符串abc=<digit1>\.<digit2>\.<digit3> 出现在文件中的任何位置,

      sed -nr 's/.*abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
      

      如果字符串 abc= 位于行首,您可以尝试以下 sed 命令。

      sed -nr 's/^abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
      

      示例:

      $ cat file
      abc=1.2.3
      foo abc=4.5.6
      bar
      $ sed -nr 's/.*abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
      123
      456
      $ sed -nr 's/^abc=([0-9])\.([0-9])\.([0-9]).*/\1\2\3/p' file
      123
      

      【讨论】:

        【解决方案3】:

        这应该可行:

        sed -E 's/abc=|([0-9])\./\1/g' file
        

        【讨论】:

        • 我收到一条错误消息,提示“/bin/sed: invalid option -- E”。如果我使用“-e”,我会收到关于 '\3' 和 's' 命令的投诉。手册页不包含“-E”选项
        • 您使用的是哪个版本的 bash?我已经更新了我的答案,所以也许这会让你感觉更好。
        • 我在 RHEL 5.9 机器上使用 4.1.5 版
        • @user972276, -E 应该可以使用它。尝试用-r 替换它。 echo 'abc=1.2.3.4.5' | sed -r 's/abc=|([0-9])\./\1/g'
        【解决方案4】:

        你也可以简单地使用 tr:

        $ tr -d [a-z.=] <<< abc=1.2.3
        123
        

        编辑:我错过了问题的一部分,即“我想在文件中找到所有匹配的字符串...”所以这可能会或可能不会工作,具体取决于另一个的内容,不需要的,线条。

        【讨论】:

        • 很好——一个跳出框框思考的人!
        • 对于我目前的具体用途,它只会在文件中找到一个,但为了将来参考,它很高兴更普遍地了解如何做事:)
        【解决方案5】:

        这是一种使用 awk 的方法,它可以处理任意数量的数字,而不仅仅是三个,用句点分隔:

        $ echo 'abc=1.2.3.4' | awk -F. -v OFS= '{sub(/.*=/, "", $1); print}'
        1234
        $ echo 'abc=1.2' | awk -F. -v OFS= '{sub(/.*=/, "", $1); print}'
        12
        

        采用awk 部分命令:

        • -F.

          使用句点作为字段分隔符。例如,如果输入是abc=1.2,那么awk 会看到两个字段:abc=12

        • -v OFS=

          这告诉awk 在打印字段时不要在字段之间放置任何空格。

        • sub(/.*=/, "", $1)

          这会从行首删除abc= 部分。

        • print

          这会打印出最后一行。

        选择要处理的行

        假设我们只想处理以abc= 开头并 后面是数字和句点的行。在这种情况下:

        $ awk -F. -v OFS= '/^abc=[0-9.]+$/ {sub(/.*=/, "", $1); print}' sample
        123
        

        其中sample 是包含更新问题中示例行的文件的名称。

        上面唯一的变化是增加了/^abc=[0-9.]+$/这个模式。这将随后的命令限制为仅适用于匹配此正则表达式的行。由于/^abc=[0-9.]+$/ 仅匹配以abc= 开头的行,后跟任意数量的句点组合,因此仅处理这些行。不匹配的行将被忽略。

        【讨论】:

        • 这可以删除 abc= 和点,但它对文件中的每一行都执行此操作。我需要它只打印以 'abc=' 开头的行
        • @user972276 可以做到。答案现在根据问题的当前编辑进行更新。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        • 2020-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多