Unix/Linux - 替换括号之间的单词

Unix/Linux - 替换括号之间的单词

我想替换 unix/Linux 中括号之间的单词,如下所示。我正在尝试将其自动化,以便仅包含一个代码即可使我的工作变得轻松。

我的 ksh 脚本中有以下字符串

   echo "Export file to below names (ABC, DEF, GHI)"

我想成为如下

   echo "Export file to below names ('ABC', 'DEF', 'GHI')"

答案1

$ echo "Export file to below names (ABC, DEF, GHI)" | sed -e "s/\([A-Z][A-Z][A-Z]\)/'\1'/g"
Export file to below names ('ABC', 'DEF', 'GHI')

答案2

在 Perl 中,几乎以一种可读的方式:

echo "Export file to below names (ABC, DEF, GHI)" |  
  perl -lne '@a = /(.*\()(.*)(\).*)/; $a[1] =~ s/\w+/\x27$&\x27/g; print @a'

第一个匹配将该行分成三部分并捕获所有内容:左括号 ( (.*\()) 之前的任何内容、任何内容 ( (.*)) 以及右括号加上任何内容 ( (\).*))。我们将它们放入 array 中@a,并对第二个元素进行替换(从零开始计数)。替换 s/\w+/\x27$&\x27/g匹配“单词字符”( ) 的字符串,并替换为用单引号括起来的\w+匹配部分(来自)。$&引号以十六进制转义,以避免与 shell 出现令人讨厌的引号舞蹈。


当然,使用 Perl 你也可以做一些不可读的事情,比如在另一个替换中进行 sed 风格的替换:

echo "Export file to below names (ABC, DEF, GHI)" |
  perl -pe 's,\(.*\), $_ = $&; s/\w+/\x27$&\x27/g; $_ ,e; ' 
Export file to below names ('ABC', 'DEF', 'GHI')

在这里,finale使外部替换将替换解释为 Perl 代码片段,它从 中获取匹配部分$&,并按上面的方式对其进行编辑。我$_在这里用作临时变量,因为$&它是只读的。替换的片段可以移动到一个函数中,这可能会使该行更具可读性。

相关内容