我尝试了以下命令并解释了我的问题:
$cat __sphlist__
signals/APASCI/algi0/algi0.sph
signals/APASCI/ancl0.sph
signals/APASCI/anpe0.sph
signals/APASCI/cepe0.sph
为什么以下命令不起作用,并显示信号内容! :
$cat __sphlist__ | while read f; do sed 's/signals/nb-signals/' $f; done
但是对回波有效吗?
$cat __sphlist__ | while read f; do echo $f; done
我像下面那样更改了sed命令,它可以工作,我想知道有什么区别?
$cat __sphlist__ | sed 's/signals/nb-signals/' | while read f; do echo $f ; done
答案 0 :(得分:1)
您应该使sed工作在文件sphlist
上,而不是该文件中的行作为输入。所以:
sed 's/signals/nb-&/' sphlist
应该做。
如果您想更改文件的内容,请添加-i
(gnu sed)
答案 1 :(得分:1)
首先,可以用Kent的解决方案代替整个命令。
现在回答您的问题:
为什么以下命令不起作用,并显示信号内容!
cat __sphlist__ | while read f; do sed 's/signals/nb-signals/' $f; done
sed希望接收文件名作为输入,并将对该文件进行所有操作。这意味着,如果变量f
具有与文件名匹配的字符串(第一行等于signals/APASCI/algi0/algi0.sph
),sed将在该文件上执行其替换并因此打印其内容。如果$f
与文件不匹配,它将失败。
您编写的命令等效于:
sed 's/signals/nb-signals/' signals/APASCI/algi0/algi0.sph
sed 's/signals/nb-signals/' signals/APASCI/ancl0.sph
sed 's/signals/nb-signals/' signals/APASCI/anpe0.sph
sed 's/signals/nb-signals/' signals/APASCI/cepe0.sph
我们不知道您的意图是什么,但是您似乎想将目录名signals
重命名为nb-signals
。以下是纠正脚本的几种方法:
在管道中使用echo
,并让sed从/dev/stdin
读取
while read -r f; do echo "$f" | sed 's/signals/nb-signals/'; done < __sphlist__
使用此处字符串作为sed
的输入while read -r f; do sed 's/signals/nb-signals/' <<< "$f"; done < __sphlist__
使用bash替代
while read -r f; do echo "${f/signals/nb-signals}"; done < __sphlist__
只需使用sed
sed 's/signals/nb-signals/' __sphlist__
注意:切勿使用cat
来循环文件!
答案 2 :(得分:0)
SED可以一一处理文件中的所有行,因此您不必在WED的每一行中填充SED。
$cat sphlist | while read f; do sed 's/signals/nb-signals/' $f; done
在上面,SED将$ f视为文件。由于没有类似的文件,因此会出现“没有这样的文件或目录”错误。
$cat sphlist | while read f; do echo $f; done
上面的命令没什么特别的,因为您正在逐行阅读并打印它们。
$cat sphlist | sed 's/signals/nb-signals/' | while read f; do echo $f ; done
在上面,您将CAT结果传递给SED,您可以直接在下面进行操作
sed 's/signals/nb-signals/' sphlist
然后将SED的结果传递给WHILE,WHILE逐行打印。以上只是您所需要的。
sed 's/signals/nb-signals/g' sphlist
在上面的命令中,在SED的末尾注意到'g'吗?这是用于文件中值的全局替换。