2017-06-16 72 views
1

我有一個bash腳本,用於修改sql文件(test.sql)。Sed - 替換文件第二行中所有出現的字符串

SQL文件如下:

select count(*) from (
select 
I.ID, 
I.START_DATE, 
I.END_DATE 
from MY_TABLE I with (nolock) 
where I.START_DATE >= '20170101' and I.START_DATE < '20170201' 
) as cnt 

我想更換所有的字符串START_DATE的出現,但只有 SQL文件的WHERE子句。

到目前爲止,我已經試過這樣:

#!/bin/bash 
sed 'x; ${/START_DATE/s/START/END;p;x}; 1d' test.sql > new-test.sql 

然而,這將返回以下新TEST.SQL文件:

select count(*) from (
select 
I.ID, 
I.START_DATE, 
I.END_DATE 
from MY_TABLE I with (nolock) 
where I.END_DATE >= '20170101' and I.START_DATE < '20170201' 
) as cnt 

字符串START_DATEWHERE子句中第二次出現沒有被替換。

我應該如何修改我的sed表達式,以便我可以實現這一目標?

+0

你需要使用'g'標誌來代替所有的事件''s/START/END/g' ...並且你可以使用tac以及''tac test。sql | sed'2s/START/END/g'| tac' – Sundeep

+0

請看看:[我應該怎麼做當有人回答我的問題?](http://stackoverflow.com/help/someone-answers) – Cyrus

回答

0

試試這樣說:

sed -e '/where/ s/START_DATE/END_DATE/g' -i test.sql 

說明:

  • 在包含where

  • (我們的 「地址」 只匹配正則表達式模式 where該線)線只經營
  • END_DATE替換每次出現的START_DATE - 注意「全局」標誌g結尾

  • -i標誌告訴sed編輯文件「in place」(不需要重定向輸出)。

0

如果您正在使用GNU sed那麼你可以使用下面的命令

sed '/WHERE/I s/START_DATE/END_DATE/g' test.sql > new-test.sql 
      ^      
      |-------------------------- case insensitive match; GNU sed only 

資本I告訴sed執行不區分大小寫的匹配。這在處理不區分大小寫的SQL命令時非常方便。

如果你沒有GNU的sed然後不區分大小寫的匹配是一個比較複雜:

sed '/[wW][hH][eE][rR][eE]/ s/START_DATE/END_DATE/g' test.sql > new-test.sql 

簡單地增加在s命令年底全球g選項將使您的解決方案的工作了。

sed 'x; ${/START_DATE/s/START/END/g;p;x}; 1d' 

但是,如果文件有尾隨換行符,它將會中斷。我強烈建議搜索(不區分大小寫)WHERE子句並運行相應的替換命令。

相關問題