当前路径的Bash引用(pwd)

当前路径的Bash引用(pwd),bash,variable-expansion,Bash,Variable Expansion,当当前路径包含空格时,PWD变量上出现了一个最烦人的问题。我的代码看起来有点像这样: mycommand |sed -E ' s|mystuff|replacement| ; s|'$(pwd)'|replacement| ; ' 这非常有效,除非当前路径包含空格字符。如果是,则将$(pwd)扩展为 'mypath/with space' “mypath/带空格” 而不仅仅是 mypath/with space mypath/带空格 这会导致sed表达式混乱(因为有额外的引号

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

mycommand |sed -E '  
 s|mystuff|replacement| ;  
 s|'$(pwd)'|replacement| ;  
 '
这非常有效,除非当前路径包含空格字符。如果是,则将
$(pwd)
扩展为
'mypath/with space' “mypath/带空格” 而不仅仅是
mypath/with space mypath/带空格

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

sed:1:“s | mypath/with”:未终止的替代模式 我已经注意到,像这样扩展pwd无助:
${pwd/\'/}


关于如何解决这个问题有什么想法吗?

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

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

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

如果替换

'$(pwd)'

那么看起来是这样的:

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

这真的是命令吗?变量没有在单引号内展开,所以我根本看不出上面的$(pwd)是如何展开的。谢谢你指出这一点。我已经添加了缺少的引号。您是否尝试过使用等效的环境变量($PWD)而不是命令替换来查看它是否有影响?正如问题中所解释的,是的。变量的内容是pwd命令返回的内容(包括单引号)。您在OP使用命令替换时使用了一个变量,但如果您将其更改为匹配(或在适当的情况下使用),则该变量有效。这将不起作用,因为$(pwd)将扩展为“mypath/with space”,这在sed表达式中不匹配。但是,如果我使用${PWD/\'/},这会起作用。@Ludvig:我尝试此操作时没有得到单引号。关于命令替换而不是变量替换的观点是正确的。我相应地更新了我的答案。更清楚的是,解决方案是在sed表达式周围使用双引号,并使用PWD环境变量,删除单引号,而不是PWD内置的仍然会产生单引号的PWD:mycommand | sed-E“s |${PWD/\'/}replacement“您在下面的行中有一个双引号不合适我甚至没有选项-E,只有-E。我已经使用以下命令进行了检查:echo PART1$(pwd)PART2 | sed-E的| PART1 | replaced |;s |'“$(pwd)”(路径|';输出是replacedPATHPART2No,将我提到的行与下一行进行比较。这只是一个输入错误。
'"$(pwd)"'
mycommand | sed -E '  
 s|mystuff|replacement| ;  
 s|'"$(pwd)"'|replacement| ;  
 '