我正在阅读中的正则表达式章节经典 Shell 脚本并输入示例代码。
这是命令:它将路径“/home/tolstoy”更改为“/home/lt”。
$ echo /home/tolstoy | sed 's;\(/home\)/tolstoy/;\1/lt/;'
/home/lt
但是,当我在笔记本电脑上的 zsh 上执行它时,返回结果是
/home/tolstoy
这个命令有错吗?正确的命令是什么?为什么?
答案1
在正则表达式中,您尝试/
在 string 后面匹配 a tolstoy
。输入中不存在该值/
,因此表达式不匹配。
/
修改为在输入中包含:
$ echo /home/tolstoy/ | sed 's;\(/home\)/tolstoy/;\1/lt/;'
/home/lt/
修改为不匹配尾随/
:
$ echo /home/tolstoy | sed 's;\(/home\)/tolstoy;\1/lt/;'
/home/lt/
修改为正确找到 的父目录tolstoy
(无论/
输入中是否尾随)并添加lt
到该路径的末尾:
$ printf '%s/lt\n' "$(dirname /home/tolstoy)"
/home/lt
或者,
$ printf '%s\n' "$(dirname /home/tolstoy)/lt"
/home/lt
一般来说,不要在 Unix 路径名上使用面向行的文本编辑工具。这样做会使您正在编写的脚本或命令无法与某些包含换行符的路径名(尽管不常见但有效)正常工作。