2015-07-10 115 views
1

所以,我查看了其他問題,沒有具體的東西似乎可以幫助我。我有一個文件,其日期變量設置爲mm/dd/yyyy,我想用其替換日期。Sed替換日期

例如:

version.js

//Application Version Information 
app_date="7/07/2015"; 
... 

而且我想用sed來替換它。我實際上有一個shell腳本替換了這個文件中的很多東西,除了日期之外,所有的工作都被替換了。目前我正在嘗試的是:

sed -i -e 's:app_date="[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]":app_date="$(date %m/%d/%Y)":g' 

但是,這並沒有讓我得到我想要的結果。我也嘗試過:

sed -ibak 's/app_date=\"[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]\"/app_date=\$(date +%m/%d/$Y)\"/g' 

這兩者似乎都不起作用。

任何想法?

編輯補充:

我已經成功地採用的解決方案是肖恩明亮的雙引號:

sed -i -e "s:app_date=".*";:app_date="$(date +%m/%d/%Y)";:g" version.js 

這工作完全滿足我的需求。

+0

你的預期產出是多少? – anubhava

+1

您的示例「日」值'7 /'與您的[0-9] [0-9] /'的正則表達式不匹配。'也可以使用YYYY-MM-DD格式作爲文件日期,並且它們將自動排序'ls'列表。祝你好運。 – shellter

+0

正則表達式的一般規則是「不要過度匹配」。因此,請參閱Sean Bright更新後的第二部分,以瞭解如何避免匹配您不關心的內容。 –

回答

2

我敢打賭,如果你匹配的日期是10月10日你的腳本將工作...

sed -i -e 's:app_date="[0-9][0-9]*/[0-9][0-9]*/[0-9][0-9][0-9][0-9]":app_date="$(date %m/%d/%Y)":g' 

的一天,一個月後表達添加* S作爲以上。 [0-9][0-9]將不匹配7

現在,我想它,因爲你不關心這個已經是該文件中的日期,大部分是不必要的,你可以簡單地做:

sed -i -e 's:app_date=".*";:app_date="'$(date +%m/%d/%Y)'";:g' version.js 
+0

你有理由保持加倍範圍而不是使用'[0-9] \ +'? –

+0

對於'sed'?是。對於'sed -r'?不。這是一個正則表達方式的東西。 –

+0

肖恩,這真棒。但是,它現在將日期替換爲「$(日期%m /%d /%Y)」,而不是將其轉換爲今天的日期。我是否需要轉義引號然後調用日期? – tadamhicks

1

您使用的是錯誤的shell引號。命令替換$()將不會在單引號內展開。

sed -i "/^app_date=/capp_date=\"$(date +%m/%d/%Y)\";" version.js # GNU only 

另一種方法,使用文件編輯器,而不是流編輯器:

ed -s version.js << EOF 
/^app_date=/c 
app_date="$(date +%m/%d/%Y)"; 
. 
w 
EOF 
1

對於Linux的

與任何更換日期
n=`date +%d` 

cal>temp 

If [$n -lt 10] 

//10 is just a predction for condition 


then 

Sed s/"$n"/*/g temp 

else 

Sed s/"$n"/**/g temp 

fi 

// s是文本替換選項 // *是代替日期的任何東西 // g是全球替代品