【问题标题】:How to replace single quotes with two single quotes in bash in Bash [duplicate]如何在bash中用两个单引号替换单引号[重复]
【发布时间】:2018-06-07 07:20:42
【问题描述】:

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

我已经尝试过这样的回声,这是美好的一天 | sed "s/'/\"/g" 但字符串没有找到匹配项并且没有给出结果。

我在 Ubuntu for windows 上使用 Bash

我做错了什么?

【问题讨论】:

  • 为什么要使用sed,考虑使用tr...(例如tr \' \"
  • 我意识到我的错误,我没有用“”标记中的回声包围文本。
  • 问题的标题是:... with two single quotes(例如'')问题的主体是:with double quotes 例如(")... - 恕我直言,那不一样。
  • 正确答案:假设txt="I'm hungry"用两个单引号替换一个单引号txt2=${txt//\'/\'\'}用一个双引号替换一个单引号 执行txt2=${txt//\'/\"}echo $txt2 以查看结果。

标签: bash sed


【解决方案1】:

扩展可以很简单地得到你想要的:

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 的值(不像第一个版本那样声明为“本地”),您很可能希望避免这种情况。

【讨论】:

  • 我想用'\'' 替换',所以当我使用eval "'$a'" 时,$a 中的任何引号都不会关闭我的引用。 eval "'${a//\'/'\''}'" 不起作用,但 $quot="'\''"; eval "'${a//\'/$quot}'" 起作用了。
猜你喜欢
  • 2017-06-19
  • 2017-08-05
  • 2019-06-01
  • 2020-12-28
  • 1970-01-01
  • 2011-01-26
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多