用sed替换无法正常工作

时间:2018-09-27 07:57:16

标签: bash sed cat

我尝试了以下命令并解释了我的问题:

$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

3 个答案:

答案 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

并不是问题,但您对的了解。

希望接收文件名作为输入,并将对该文件进行所有操作。这意味着,如果变量f具有与文件名匹配的字符串(第一行等于signals/APASCI/algi0/algi0.sph),将在该文件上执行其替换并因此打印其内容。如果$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,并让/dev/stdin读取

    while read -r f; do echo "$f" | sed 's/signals/nb-signals/'; done < __sphlist__
    
  • 使用此处字符串作为

    的输入
    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 's/signals/nb-signals/' __sphlist__
    

注意:切勿使用cat来循环文件!

答案 2 :(得分:0)

How SED works.

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'吗?这是用于文件中值的全局替换。