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