用sed + bash函数替换

时间:2011-04-25 09:49:53

标签: bash sed substitution

我的问题似乎很笼统,但我找不到任何答案。

在sed命令中,如何用简单的bash函数返回的值替换替换模式。

例如,我创建了以下函数:

function parseDates(){
    #Some process here with $1 (the pattern found)
    return "dateParsed;
}

以及下面的sed命令:

myCatFile=`sed -e "s/[0-3][0-9]\/[0-1][0-9]\/[0-9][0-9]/& parseDates &\}/p" myfile`

我发现了'&'表示当前发现的模式,我希望它传递给我的bash函数,并且整个模式将被找到的模式替换为+ dateParsed。

有人有想法吗? 感谢

7 个答案:

答案 0 :(得分:3)

您可以在sed命令中使用“e”选项,如下所示:

cat t.sh

myecho() {
        echo ">>hello,$1<<"
}
export -f myecho
sed -e "s/.*/myecho &/e" <<END
ni
END

你可以看到没有“e”的结果:

cat t.sh

myecho() {
        echo ">>hello,$1<<"
}
export -f myecho
sed -e "s/.*/myecho &/" <<END
ni
END

答案 1 :(得分:1)

同意格伦杰克曼。 如果你想在sed中使用bash函数,可以这样:

sed -rn 's/^([[:digit:].]+)/`date -d @&`/p' file |
while read -r line; do
    eval echo "$line"
done

我的文件以unix时间戳开头(例如1362407133.936)。

答案 2 :(得分:0)

一步一步地做。 (也可以使用备用分隔符,例如“|”而不是“/”

function parseDates(){
    #Some process here with $1 (the pattern found)
    return "dateParsed;
}

value=$(parseDates)
sed -n "s|[0-3][0-9]/[0-1][0-9]/[0-9][0-9]|& $value &|p" myfile

请注意使用双引号而不是单引号,以便可以插值$ value

答案 3 :(得分:0)

我想知道是否有办法做到这一点。但是,对于这个特殊问题,您不需要它。如果您使用() s围绕日期的不同组成部分,则可以使用\1 \2等对其进行引用,然后根据需要重新格式化。

例如,让我们颠倒03/04/1973:

echo 03/04/1973 | sed -e 's/\([0-9][0-9]\)\/\([0-9][0-9]\)\/\([0-9][0-9][0-9][0-9]\)/\3\/\2\/\1/g'

答案 4 :(得分:0)

sed -e 's#[0-3][0-9]/[0-1][0-9]/[0-9][0-9]#& $(parseDates &)#' myfile |
while read -r line; do
    eval echo "$line"
done

答案 5 :(得分:0)

sed中的bash函数(可能出于其他目的):

multi_stdin(){ #Makes function accepet variable or stdin (via pipe)
    [[ -n "$1" ]] && echo "$*" || cat -
}

sans_accent(){ 
    multi_stdin "$@" | sed '
        y/àáâãäåèéêëìíîïòóôõöùúûü/aaaaaaeeeeiiiiooooouuuu/
        y/ÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜ/AAAAAAEEEEIIIIOOOOOUUUU/
        y/çÇñÑߢÐð£Øø§µÝý¥¹²³ªº/cCnNBcDdLOoSuYyY123ao/
    '
}

eval $(echo "Rogério Madureira" | sed -n 's#.*#echo & | sans_accent#p')

eval $(echo "Rogério Madureira" | sed -n 's#.*#sans_accent &#p')

Rogerio

如果您需要将输出保留为变量:

VAR=$( eval $(echo "Rogério Madureira" | sed -n 's#.*#echo & | desacentua#p') )
echo "$VAR"

答案 6 :(得分:-4)

您可以通过结束单引号部分将sed命令粘合在一起,然后重新打开它。

sed -n 's|[0-3][0-9]/[0-1][0-9]/[0-9][0-9]|& '$(parseDates)' &|p' datefile

但是,与其他示例相比,bash中的函数不能返回字符串,只能将它们删除:

function parseDates(){
    # Some process here with $1 (the pattern found)
    echo dateParsed
}