首页 > 解决方案 > 是否可以使用 shell 命令查找和替换包含单个字符的行?

问题描述

是否可以使用sedorawk或任何其他 shell 命令来识别带有单个字符的行,例如),然后用其他东西替换它?可能有很多行包含)但它只替换有单个字符的行)。例子:

exp =  ... +
     (    x  
        + 2*(y) 
        + z
      )
       + ...

我想要得到的是以下内容

exp =  ... +
     (    x 
        + 2*(y) 
        + z
      }
       + ...

如果我使用普通的 sed 命令来替换)它,它将用).

sed -i -e 's/)/\}/g' file

会给

exp =  ... +
     (    x
        + 2*(y} 
        + z
      }
       + ...

有出路吗?

编辑:带有嵌套括号的示例,其中单行包含内部嵌套括号,该解决方案不起作用(对于此示例):

sed -e 's/(\(.*\))/{\1}/g'

      ...
   + LNb * (
      + ( - 224/27 + ( - 8/3)*Lqf^2 + (80/9)*Lqf)*CF*NF
      + (1616/27 - 56*[Zeta[3]] + ( - 536/9 + 16*[Zeta[2]])*Lqf + (44/3)*
     Lqf^2)*CF*CA
      + ((32 - 128*[Zeta[2]])*Lqf)*CF^2
      )
     + ...

这使

      ...
   + LNb * (
      + { - 224/27 + ( - 8/3)*Lqf^2 + (80/9)*Lqf}*CF*NF
      + {1616/27 - 56*[Zeta[3]] + ( - 536/9 + 16*[Zeta[2]])*Lqf + (44/3}*
     Lqf^2)*CF*CA
      + {(32 - 128*[Zeta[2]])*Lqf}*CF^2
      )
     + ...

不像

      ...
   + LNb * {
      + ( - 224/27 + ( - 8/3)*Lqf^2 + (80/9)*Lqf)*CF*NF
      + (1616/27 - 56*[Zeta[3]] + ( - 536/9 + 16*[Zeta[2]])*Lqf + (44/3)*
     Lqf^2)*CF*CA
      + ((32 - 128*[Zeta[2]])*Lqf)*CF^2
      }
     + ...

而我知道如何避免它,例如我可以合并行,使其成为单行,然后我可以使用命令将最外层替换(...){...}. 然而,这些还有一些其他后果,并不是这个问题所特有的。

我的主要查询不是为这些示例解决问题,而是要了解是否可以检测和替换)文件中仅包含一个字符而没有其他字符的行,其中文件可能有许多其他出现的)字符,这些字符将是完好无损的。

标签: bashawksedreplacestr-replace

解决方案


对于任何 POSIX sed:

$ sed 's/^\([[:space:]]*\))\([[:space:]]*\)$/\1}\2/' file
exp =  ... +
     (    x
        + 2*(y)
        + z
      }
       + ...

推荐阅读