2011-04-25 88 views
4

我的問題似乎是一般的,但我找不到任何答案。sed + bash函數替代

在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。

有沒有人有想法? 謝謝

回答

-2

您可以結束了單引號部分,然後再重新打開它粘合起來一個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 
} 
+1

我仍然有這個解決方案的問題。 bash函數被調用。但參數&似乎沒有被正確地複製在函數中,因爲我不能使用$ 1參考&。 – 2011-04-25 12:59:01

+0

哦,我很抱歉,但上面的解決方案是一個函數,它不僅僅只有參數,並且在sed命令之前被評估。另一種可能性是,稍後調用'$(script $(sed'sedcmd'file))' – 2011-04-25 14:51:51

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 

注意使用雙引號來代替單引號,讓$值可以插值

+1

我相信所要求的是將匹配的模式作爲參數傳遞給bash函數。 – Mat 2011-04-25 10:13:40

+0

dateParsed不需要打開'''或關閉一個,而不是「return」,它只能返回一個int,一個echo或printf。 – 2011-04-25 11:39:42

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' 
+0

如果你想清理你的命令中的/ s,sed能夠接受除/以外的字符(s ///),例如以下內容應與您的示例相同: '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'' – paulw1128 2011-09-01 16:16:22

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 
2

您可以使用這樣的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 
+0

選項'e'不被識別。另外我試圖導出我的功能通過出口-f parseDate,這是行不通的。這個例子對我不起作用。 – 2011-04-26 10:35:11

+0

我不得不折騰把它改成'$(myecho)' – 2015-10-22 04:28:54

1

同意Glenn Jackman。 如果你想使用bash功能SED,是這樣的:

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

我的文件在這裏與Unix時間戳(例如1362407133.936)開始。