如何在Bash中用bash中的两个单引号替换单引号

时间:2017-04-09 21:08:24

标签: bash sed

我正在尝试使用sed替换双字引号中的单引号。

我试过这样的回声,这是一个美好的一天sed“s /'/ \”/ g“但字符串找不到匹配项,也没有给出结果。

我在Ubuntu上使用Bash for windows

我做错了什么?

1 个答案:

答案 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”),您可能希望避免这种情况。