所以我的情况是我有很多文件,比如: foo1.conf ... foo10.conf
每个文件包含以下信息
client: backup
tree: /backup/foo/current
xdev: 1
image-default: %Y%m%d
#exclude:
# /var/cache/apt/archives/*.deb
# /var/cache/man/**
# /tmp/**
# /var/tmp/**
# *.bak
我正在尝试“oneliner”,我将在backup / foo / current中用文件basename替换foo。
到目前为止,我得到了这个
for i in *.conf; do basename $i .conf; sed -i "s/foo/${i}/" $i; done
,但这会用文件名替换foo,例如。 foo1.conf而不是foo1。
不知何故,我需要返回do basename $i .conf
的输出,以便它可以与sed一起使用。我只是出于想法而谷歌没有给出答案也没有给我开悟。
编辑:当我发布这个问题时,我发现了这个:
for i in *.conf; do j=$(basename $i .conf); echo sed -i "s/foo/${j}/" $i; done
所以我错过了一个具有正确语法的变量。
答案 0 :(得分:0)
#!/bin/bash
for i in *.conf; do name=$(echo "$i" | cut -d "." -f 1); sed "s/foo/$name/g" $1; done
<强>输出:强>
sdlcb @ ubuntu:〜/ AMD_C $ ./ff tt
client: backup
tree: /backup/a/current
xdev: 1
image-default: %Y%m%d
#exclude:
# /var/cache/apt/archives/*.deb
# /var/cache/man/**
# /tmp/**
# /var/tmp/**
# *.bak
client: backup
tree: /backup/b/current
xdev: 1
image-default: %Y%m%d
#exclude:
# /var/cache/apt/archives/*.deb
# /var/cache/man/**
# /tmp/**
# /var/tmp/**
# *.bak
sdlcb@ubuntu:~/AMD_C$
答案 1 :(得分:0)
我正在寻找的答案让我感觉像是晴朗的天空。我需要以do basename $i .conf;
的格式添加do j=$(basename $i .conf)
的输出,因此可以在sed -i "s/foo/${j}/" $i
使用变量j代替i
所以最后一行被塑造成:
for i in *.conf; do j=$(basename $i .conf); sed -i "s/foo/${j}/" $i; done
如果你想测试线路sed部分可以回复如下:
for i in *.conf; do j=$(basename $i .conf); echo sed -i "s/foo/${j}/" $i; done
因此,没有进行任何实际更改,您可以检查它是否符合您的要求。