Bash - 替换目录中所有文件中的字符串

时间:2013-07-17 12:58:14

标签: bash replace text-files batch-processing

我在目录中有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还是类似的工具?怎么样?

3 个答案:

答案 0 :(得分:1)

类似的东西:

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

应该有用。

将要保留的字符串分组,在替换字符串中添加占位符(\1)。当然,将newtimestamp替换为您喜欢的任何值。

答案 1 :(得分:0)

我会像这样使用sed这样做:

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

sed的-i标志意味着它会修改文件到位,所以我通常首先使用-e标志而不是-i标志在单个文件上尝试它,并确认sed的输出是我正在寻找的。

说明:

  1. 双引号可以保护我的正则表达式。
  2. /^[ \t]*ODI_SESJA_ID CONSTANT/仅匹配以空格开头,后跟'ODI_SESJA_ID CONSTANT'的行。
  3. s/'[^']\+'/'REPLACEMENT'/将'REPLACEMENT'(引用)替换为匹配行上文字的第一个引用部分。
  4. http://www.catonmat.net/blog/wp-content/uploads/2008/09/sed1line.txt处的文档(谷歌搜索'sed one liners'对于快速发送这些任务非常有帮助。

答案 2 :(得分:0)

我找到了一些最简单的解决方案,似乎很好:

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

它将包含ODI_SESJA_ID的行替换为新值。不是很优雅,因为它取代了整行,而不仅仅是需要处理的值。

相关问题