2013-07-17 88 views
0

我有一個目錄31 .CTL文件,這些文件看起來是這樣的:巴什 - 替換字符串的所有文件中,在目錄

load data CHARACTERSET AL32UTF8 
infile '../dane/kontakty_Biura_wyborcze.csv' "str '\n'" 
append 
into table ODI_PUW_OSOBY2 
fields terminated by ';' 
OPTIONALLY ENCLOSED BY '"' AND '"' 
trailing nullcols 
      (LP CHAR(4000), 
      WOJEWODZTWO CHAR(4000), 
      POWIAT CHAR(4000), 
      GMINA CHAR(4000), 
      NAZWA_INSTYTUCJI CHAR(4000), 
      KOD CHAR(4000), 
      MIEJSCOWOSC CHAR(4000), 
      ADRES CHAR(4000), 
      NAZWISKO_I_IMIE CHAR(4000), 
      FUNKCJA CHAR(4000), 
      TEL_SLUZB_STACJON_1 CHAR(4000), 
      TEL_SLUZB_STACJON_2 CHAR(4000), 
      TEL_SLUZB_STACJON_3 CHAR(4000), 
      TEL_SLUZB_KOM_1 CHAR(4000), 
      TEL_SLUZB_KOM_2 CHAR(4000), 
      FAX_SLUZB_1 CHAR(4000), 
      FAX_SLUZB_2 CHAR(4000), 
      EMAIL_SLUZB_1 CHAR(4000), 
      EMAIL_SLUZB_2 CHAR(4000), 
      WWW CHAR(4000), 
      TYP CONSTANT "Biura wyborcze.", 
      ODI_SESJA_ID CONSTANT "20130717144702" 
      ODI_STATUS CONSTANT "0", 
      IMIE EXPRESSION  "pg_odi_utils.zwroc_imiona(pg_odi_utils.usun_przyrostki(:NAZWISKO_I_IMIE),0)", 
      NAZWISKO EXPRESSION "pg_odi_utils.zwroc_nazwisko(pg_odi_utils.usun_przyrostki(:NAZWISKO_I_IMIE),0)" 
     ) 

有31個文件這樣的。我需要替換此行中的值:

ODI_SESJA_ID CONSTANT '20130717144702' 

到新的時間戳,對所有文件都是一樣的。當前時間戳未知(我指的是當前存在於文件中的值,在本例中爲'20130717144702')。

所以我需要(在目錄中找到的每個文件):

  • 行查找從ODI_SESJA_ID開始
  • 後「ODI_SESJA_ID常量」與新
  • 在文件中的其餘線路替換值應保持不變

什麼是使用bash來做到這一點的最佳方法?我應該使用sed還是類似的工具?怎麼樣?

回答

1

喜歡的東西:。

sed 's/\(^[ \t]\+ODI_SESJA_ID\ CONSTANT\).*/\1 \"newtimestamp\"/' tmp 

應該工作。

對將要保留的字符串進行分組,在替換字符串中添加佔位符(\1)。當然,用你喜歡的任何值代替newtimestamp

+0

你是對的,它的工作原理。感謝解決方案。 – user1209216

+0

不客氣。 :-) – iandexter

0

我會做到這一點使用的sed像這樣:

sed -i "/^[ \t]*ODI_SESJA_ID CONSTANT/s/'[^']\+'/'REPLACEMENT'/" *.ctl 

-i參數來的sed意味着就地修改文件,所以我通常與-e標誌第一次嘗試在一個單一的文件,而不是的-i標誌並確認sed的輸出是我正在尋找的。

說明:

  1. 雙引號保護我的正則表達式從殼。
  2. /^[ \t]*ODI_SESJA_ID CONSTANT/僅匹配以空格開頭的行,後跟'ODI_SESJA_ID CONSTANT'。
  3. s/'[^']\+'/'REPLACEMENT'/將'REPLACEMENT'(引用)替換爲匹配行上文本的第一個引用部分。 。

http://www.catonmat.net/blog/wp-content/uploads/2008/09/sed1line.txt(上谷歌命中爲文件「sed的一個套」是快速調度這些類型的任務非常有益的

+0

不適用於我...沒有錯誤,但沒有效果,文件似乎是未經修改的 – user1209216

0

我發現了一些簡單的解決方案,這似乎是不錯的:

sed -i 's/.*ODI_SESJA_ID.*/    ODI_SESJA_ID CONSTANT "'$(date +%s)'",/' *.ctl 

它取代了包含ODI_SESJA_ID新的價值線不是很優雅,因爲它取代了整條生產線,而不是隻需要處理價值