【问题标题】:Bash quoting of current path (pwd)当前路径的 Bash 引用 (pwd)
【发布时间】:2009-09-07 19:52:29
【问题描述】:

当当前路径包含空格时,我遇到了PWD 变量上出现的最烦人的问题。我的代码看起来有点像这样:

mycommand |sed -E '  
 s|mystuff|replacement| ;  
 s|'$(pwd)'|replacement| ;  
 '

这很好用,除非当前路径包含空格字符。如果是,$(pwd) 将扩展为

'mypath/带空格'
而不仅仅是
mypath/with space

这会导致 sed 表达式混乱(因为额外的引号):

sed: 1: "s|mypath/with": 未终止的替代模式

我注意到像这样扩展 pwd 并没有帮助:${PWD//\'/}

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 这真的是命令吗?变量不会在单引号内展开,所以我根本看不到上面的 $(pwd) 会如何展开。
  • 感谢您指出这一点。我已经添加了缺少的引号。
  • 您是否尝试过使用等效的环境变量 ($PWD) 而不是命令替换来查看它是否有所作为?
  • 正如问题中所解释的那样,是的。变量的内容是 pwd 命令返回的内容(包括单引号)。

标签: bash variable-expansion


【解决方案1】:

用双引号代替单引号,用pwd周围的反引号代替引号:

mycommand | sed -E "
 s|mystuff|replacement| ;
 s|`pwd`|replacement| ;
"

双引号允许扩展变量和反引号命令。

【讨论】:

  • 您使用了一个变量,其中 OP 使用了命令替换,但如果您将其更改为匹配(或者在适当的情况下按原样使用它),它就会起作用。
  • 这不起作用,因为 $(pwd) 将扩展为 'mypath/with space',这在 sed 表达式中将不匹配。不过,如果我使用 ${PWD//\'/} 这会起作用。
  • @Ludvig:我尝试这个时没有得到单引号。
  • 关于命令替换而不是变量替换的观点是正确的。我相应地更新了我的答案。
  • 要明确,解决方案是在 sed 表达式周围使用双引号,并使用 PWD 环境变量,删除单引号,而不是仍然会产生单引号的 pwd 内置: 我的命令 | sed -E " s|${PWD//\'/}|替换"
【解决方案2】:

如果你替换会发生什么

'$(pwd)'

'"$(pwd)"'

然后看起来像这样:

mycommand | sed -E '  
 s|mystuff|replacement| ;  
 s|'"$(pwd)"'|replacement| ;  
 '

【讨论】:

  • 您在“with”之后的行中有一个不合适的双引号
  • 哦,好吧...我可以使用旧版本的 sed 吗?我什至没有选项-E,只有-e。我已经使用以下命令进行了检查:echo PART1$(pwd)PART2| sed -e 的|PART1|替换| ; s|'"$(pwd)"'|路径|;' ;并且输出被替换PATHPART2
  • 不,将我提到的行与倒数第二行进行比较。这只是一个错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2022-10-13
  • 1970-01-01
相关资源
最近更新 更多