【问题标题】:Pattern matching using a variable in SED在 SED 中使用变量进行模式匹配
【发布时间】:2013-11-23 08:10:22
【问题描述】:

考虑下面的代码:

pattern="*.some_pattern.*"
orignalLogFile='sample.log'
outputFile='1.txt'
temp='1.log'

# match the pattern and replace with a new line
sed 's/'$pattern'/\n/' $orignalLogFile > $temp

抛出一个

'sed: -e expression #1, char 9: unterminated `s' command'

如何解决这个问题?

【问题讨论】:

    标签: sed


    【解决方案1】:

    你可能需要两个更正

    您的模式中的*. 没有意义,所以

    pattern=".*some_pattern.*"
    

    另外,您需要在双引号中传递模式以保护它免受 shell 扩展

    sed 's/'"$pattern"'/\n/' file
    

    【讨论】:

      【解决方案2】:

      Sed 不接受换行符。 AFAIK 它也不接受星星;但我认为您不需要使用这些。

      pattern="some_pattern"
      orignalLogFile='sample.log'
      outputFile='1.txt'
      
      read -r < "${originalLogFile}"
      
      echo "${REPLY}" | sed s"@${pattern}@newline@" > newlog.tmp
      
      read newlog < newlog.tmp
      
      echo "${newlog}" | tr 'newline' '\n' > "${outputFile}"
      rm newlog.tmp
      

      【讨论】:

      • 直接使用模式而不将其放在变量中可以正常工作。 sed 用换行符替换模式 sed 's/.*patterntomatch.*/\n/' sample.log > newLog.txt 这很好用。问题是当我在变量中有“模式匹配”时。
      • 这可能适用于 Linux 中的 GNU sed,是的;但这不符合 POSIX,因此不可移植。我给你的解决方案适用于 FreeBSD,因此是可移植的;它将与 OSX 以及可能的任何其他 UNIX 一起使用。 GNU 实用程序具有破坏 POSIX 标准的扩展;这是我不在 Linux 下编写脚本的一大原因。此外,您可以绕过不适用于 sed 的变量,方法是将其放在双引号中而不是单引号中,就像我在那里一样。
      猜你喜欢
      • 2013-07-31
      • 2019-09-07
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2015-10-03
      • 2012-05-06
      相关资源
      最近更新 更多