我正在尝试通过 修改存储在变量 ( $var
)中的路径sed
。实际上,出于$(dirname "$var")
与脚本目的相关的原因,我需要进行替换。
var
is的一个例子var=/dir/dir xyz/file.txt
,whilefilename
包含几个要替换的路径,它们可以在任何位置(一次靠近行的中间,另一个在开头,等等)。下面我试着举个例子filename
:
dog foo/bar /dir/dir xyz/file.txt
a b c d /dir/dir xyz/file.txt x y z
/dir/dir xyz/file.txt 1234
{[(/dir/dir xyz/file.txt
我想要的是
dog foo/bar .
a b c d . x y z
. 1234
{[(.
我尝试了以下
sed "s|"$(dirname "$var")"|.|g" "$filename"
获得sed: -e expression #1, char 31: unterminated `s' command
你可以帮帮我吗?当然,除了sed
.
这似乎是您尝试做的所有事情,使用任何 sed 并假设您的变量不包含任何
:
s:我不知道你为什么打电话
dirname
。此外,如果您不打算将我们用作/
sed 定界符,请不要使用 regexp 元字符,因为|
它充其量只会混淆您的代码,选择一个:
始终是文字的字符。并且不要对非环境变量使用全部大写的变量名称,请参阅correct-bash-and-shell-script-variable-capitalization。鉴于您的评论
dirname
,如果您确实出于某种原因确实需要打电话,那么您可以这样做:在:
The
s|
和|.|g
正在被引用,但是 the$(dirname "$var")
不在引号范围内,因此受到 split+glob 的影响。会解决这个问题(同时添加缺失的s),但这仍然是错误的,因为in
--
的左侧被解释为正则表达式(更不用说如果包含字符,您可能会遇到严重的问题;并且可以处理文本,而不保证文件名是)。s/lhs/rhs/flags
sed
$var
|
sed
例如,
.
匹配任何字符,而不仅仅是.
.你应该这样做:
为此,可以使用任意文件路径¹。
¹ 严格来说,对于任意文件路径,包括那些包含换行符的文件路径,我们需要添加选项
-0777
(slurp 模式)perl
,并且不能使用去除尾随换行符的命令替换。这可以通过将完整的传递$var
给perl
并使用 perldirname()
(来自File::Basename
模块)来完成。