繁体   English   中英

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

[英]Bash script to enclose words in single quotes

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

词 - 你好089

结果 - 'Hello089',

我尝试了以下正则表达式,但它不起作用。 这适用于带有查找和替换的 Notepad++。 我不确定如何对其进行调整以使其在 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(第二个)解决方案使用.+模式来做同样的事情。 右侧的&用于插入整个匹配项(又名\0 )。 当然,您可以用捕获括号将整个匹配括起来,然后使用\1 ,但这是多余的:

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

请参阅 escaping,必须转义 POSIX BRE 中的捕获括号。

请参阅在线sed演示

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

$1sed看到它之前由 shell 扩展,但无论如何它都是错误的反向引用。 你需要\1 您还需要转义定义捕获组的括号。 因为sed脚本用双引号括起来,所以您需要转义所有反斜杠。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM