Bash 脚本将单词括在单引号中



我正在尝试编写一个bash脚本,用单引号将文件中包含的单词括起来。

单词 - 你好089

结果 - "你好089",

我尝试了以下正则表达式,但它不起作用。这适用于带有查找和替换功能的记事本++。我不确定如何调整它以使其在 bash 脚本中工作。

sed "s/(.+)/'$1',/g" file.txt > result.txt

替换反向引用(也称为占位符)是用n语法定义的,而不是$n(这是类似perl的反向引用语法)。

请注意,此处不需要组,因为您希望用单引号将整行括起来。这也是为什么您不需要g标志的原因,它们仅在您计划在同一行、输入字符串上查找多个匹配项时才是必需的。

您可以使用以下 POSIX BRE 和 ERE(带有-E的解决方案):

sed "s/..*/'&',/" file.txt > result.txt
sed  -E "s/.+/'&',/" file.txt > result.txt

在 POSIX BRE(第一个)解决方案中,..*匹配任何字符,然后匹配任何 0 个或多个字符(从而模拟.+常见的 PCRE 模式)。POSIX ERE(第二个)解决方案使用.+模式来执行相同的操作。右侧的&用于插入整个匹配项(又名)。当然,您可以用捕获括号将整个匹配项括起来,然后使用1,但这是多余的:

sed "s/(..*)/'1',/" file.txt > result.txt
sed  -E "s/(.+)/'1',/" file.txt > result.txt

请参阅转义,捕获括号在 POSIX BRE 必须转义。

请参阅在线sed演示。

s="Hello089";
sed "s/..*/'&',/" <<< "$s"
# => 'Hello089',
sed -E "s/.+/'&',/" <<< "$s"
# => 'Hello089',
$1

sed看到它之前就被 shell 扩展了,但无论如何它都是错误的反向引用。你需要1.您还需要转义定义捕获组的括号。由于sed脚本括在双引号中,因此需要转义所有反斜杠。

$ echo "Hello089" | sed "s/\(.*\)/'1',/g"
'Hello089',

(我不记得是否有办法使用 ASCII 代码而不是文字'指定单引号,这将允许您在脚本周围使用单引号。

最新更新