用其基本名称替换文件中的字符串

时间:2014-10-23 11:14:31

标签: bash shell sed

所以我的情况是我有很多文件,比如: 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

所以我错过了一个具有正确语法的变量。

2 个答案:

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

因此,没有进行任何实际更改,您可以检查它是否符合您的要求。