我的问题似乎很笼统,但我找不到任何答案。
在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。
有人有想法吗? 感谢
答案 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
}