Sed 对我给它的文件路径感到非常困惑

Chr*_*rno 0 bash shell zsh sed

我试图将带有 sed 替换的文件传递给 sed,它忽略了我给它的部分路径:

首先,让我们从一个简单的断言开始:

 test -f workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed && echo "exists"
exists
Run Code Online (Sandbox Code Playgroud)

是的,文件存在。现在,问题是:

sed -E -n -f  /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv  
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

它会丢弃oin之前的所有内容workdir

我尝试过一个新的外壳,没有扩展

env -i /opt/brew/bin/bash
bash-5.2$ sed -n -E -f "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed"  "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv"                                                                                                                                                                                                                                                                
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我尝试过旧版本的 bash:

 test -f workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed && echo "exists"
exists
Run Code Online (Sandbox Code Playgroud)

我已经尝试过zsh

sed -E -n -f  /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv  
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我也尝试过gsed

env -i /opt/brew/bin/bash
bash-5.2$ sed -n -E -f "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed"  "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv"                                                                                                                                                                                                                                                                
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我直接 cd 进入该文件的文件并删除所有路径:

env -i bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ sed -n -E -f "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed"  "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv"
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

使用替换:

env -i zsh
sed -E -n -f /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv                                                                                                                                                   
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory

Run Code Online (Sandbox Code Playgroud)

尝试过这个:

bash-3.2$ cd $(dirname  /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed)
bash-3.2$ pwd
/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58
bash-3.2$ ls -al templates.sed data.psv
-rw-r--r--  1 cbongior  staff  1081134967 Aug  4 13:30 data.psv
-rwxrwxrwx  1 cbongior  staff       62087 Aug  7 15:51 templates.sed
bash-3.2$ sed -E -n -f templates.sed data.psv 
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

好吧,现在只是把事情搞砸了!

gsed -n -E -f "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed"  "/Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv" 
gsed: couldn't open file orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

所以,如果我添加缺失的内容,w它就会忽略它。但如果我添加 2w就不会了?

这里我改变了arg顺序:

 sed -E -n -f workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/data.psv
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

好的,最后一次尝试:如果这是一个 shell 问题,那么任何工具都有同样的困惑:

bash-5.2$ grep -E '.*'  /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed | wc -l
+ grep -E '.*' /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed
+ wc -l
     499
Run Code Online (Sandbox Code Playgroud)

我目前的猜测是(g)sed将其解释为某种开关,但我在文档中没有看到它,这是来自已经运行了一段时间的脚本的代码。

Gor*_*son 6

我怀疑这根本不是命令的问题,而是文件中某些内容的问题templates.sed。具体来说,我怀疑有一行像

workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed
Run Code Online (Sandbox Code Playgroud)

...它将sed解释为w命令(将模式空间写入文件),文件名为“orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59 -58/templates.sed”。这是一个快速演示:

$ cat demo.sed 
workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed
$ sed -f demo.sed 
sed: orkdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

尝试运行grep orkdir /Users/cbongior/dev/omc/workdir/2023-08-03/2023-07-21-01-30-19_2023-07-31-23-59-58/templates.sed并查看它显示的内容。