bash - 用 sed 替换不能正常工作
问题描述
我尝试了以下命令并解释了我的问题:
$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
解决方案
首先,整个命令可以用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__
使用 here-string 作为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
for 循环文件!
推荐阅读
- local-storage - Flutter webivew如何设置本地存储
- sql - select count(*)+count(*) 这个 sql 语句是否产生任何结果或错误?
- r - Diff 函数在与行上应用时转置矩阵
- linux-kernel - 为什么我的内核模块完美地执行浮点除法?
- python - 从 Python 中的时间戳字符串中提取日、月和小时
- c - C 语言 OpenLDAP API 用于获取可用于搜索结果条目的属性数量
- validation - 续集自定义验证器
- reactjs - 如何从 react-data-grid 的列格式化程序组件调度操作
- highcharts - Highstock 数据分组选项
- vba - Excel VBA - 将特定列从一个工作表复制到另一个工作表