我正在尝试使用sed替换双字引号中的单引号。
我试过这样的回声,这是一个美好的一天sed“s /'/ \”/ g“但字符串找不到匹配项,也没有给出结果。
我在Ubuntu上使用Bash for windows
我做错了什么?
答案 0 :(得分:4)
扩展可以非常简单地为您提供所需内容:
original="it's a lovely day"
modified=${original//\'/\"}
echo "$modified"
除了简单性之外,此扩展不使用外部命令(仅限shell功能),因此性能开销远低于启动单独的进程。
稍微打破语法:
${original...}
表示我们正在扩展original
变量//
表示“搜索所有事件”\'
是转义单引号(要搜索的文字)/
表示“替换为”\"
是一个转义双引号(要替换的文字)另一种有趣的方式:
repl()
{
local IFS="$2$1"
set -- $3
echo "$*"
}
repl \' \" "it's a lovely day"
repl "'" '"' "it's a lovely day" # Quoted rather than escaped
可以以子shell为代价使POSIX兼容(参见下面的评论):
repl()
(
IFS="$2$1"
set -- $3
echo "$*"
)
(repl \' \" "it's a lovely day")
(repl "'" '"' "it's a lovely day") # Quoted rather than escaped
子shell是通过将语句括在括号中创建的。不执行此操作会更改IFS的值(在第一个版本中未声明为“local”),您可能希望避免这种情况。