【问题标题】:Using regular expression in bash script在 bash 脚本中使用正则表达式
【发布时间】:2010-12-11 00:46:49
【问题描述】:

我是 bash 脚本的新手,但我想做以下事情:

我想检测 FILE_1 中的模式 STRING_1 "STRING_2" 并将 STRING_2 附加到 FILE_2

有什么简洁的方法可以做到这一点?

【问题讨论】:

    标签: regex linux bash shell scripting


    【解决方案1】:

    您的问题相当模糊;但我猜你想要什么

    如果 FILE_1 中存在 STRING_1,则将 STRING_2 附加到 FILE_2

    answer=`grep -c STRING_1 FILE_1`
    if [ "$answer" -gt 0 ] 
    then
         echo "$STRING_2" >> FILE_2
    fi
    

    【讨论】:

    • 或者,grep -c STRING_1 FILE_1 && echo "$STRING_2" >> FILE_2 :) 但我不确定他的意思,虽然这个问题很模糊..
    • 如果STRING_2 未知,则不能使用它。 redShadow 建议的替代方案,但仍使用if 将是:if grep -sq STRING_1 FILE_1; then。不需要变量、括号或比较。
    【解决方案2】:

    你可以这样做:

       sed 's/STRING_1 \"(.*)\"/\1/g' FILE_1 >FILE_2
    

    这里发生的事情是,sed 正在搜索 FILE_1 的第一个和第二个“/”之间的所有内容,并将第二个和第三个“/”之间的内容发送到 FILE_2。

    () 组分配给 \1、\2 等...所以 \" 之间的所有内容都是您的 STRING_2。

    【讨论】:

    • 需要使用>>追加。不必转义双引号,而是转义括号(除非您使用sed-r 选项。将模式从.* 更改为[^"]* 可能会更好,因为@987654327 @ 正则表达式是贪婪的。
    【解决方案3】:
    grep -Po '(?<=aaa ")([^"]*)(?=")' FILE_1 >> FILE_2
    

    【讨论】:

    • 很好.. 我没有考虑将否定断言与-o 一起使用,但它似乎有效,并且是避免使用grep | sed 管道的好方法..跨度>
    【解决方案4】:

    如果我正确理解了这个问题,那么你有一个文件包含:

    word1a "word1b"
    word2a "word2b"
    word3a "word3b"
    

    您可以使用 sed 提取引号之间包含的值,然后重定向到文件

    sed 's/.*"\(.*\)"/\1/' FILE_1 > FILE_2
    

    【讨论】:

      【解决方案5】:

      你也可以用这个:

      grep '^\s*STRING_1\s*\".*\"\s*$' FILE_1 | awk -F \" '{printf $2"\n"}' >> FILE_2
      

      它可以正确处理输入文件的多个空白字符,并在 FILE_2 末尾的 STRING_2 之后附加一个换行符。

      【讨论】:

        【解决方案6】:

        这就是我现在拥有的:

        sed 's/STRING_1\s*:\s*"([^"]*)"/\1/g' "FILE_1" >> FILE_2;

        我希望它检测文件 1 中的以下模式:

        STRING_1   :   "STRING_2"
        

        并将 STRING_2 保存到文件 2

        但这不起作用,它会在 FILE_2 中附加很多随机内容(不应该匹配)

        【讨论】:

          猜你喜欢
          • 2011-11-01
          • 2010-09-23
          • 2019-11-16
          • 2013-06-06
          • 2011-10-17
          • 2019-09-15
          • 2022-01-13
          相关资源
          最近更新 更多