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 CONSTANT”之后的值
  • 文件中的其余行应保持不变

使用 bash 执行此操作的最佳方法是什么?我应该使用 sed 还是类似的工具?如何?

4

3 回答 3

1

就像是:

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

应该管用。

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

于 2013-07-18T09:01:41.700 回答
0

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

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

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

于 2013-07-18T08:50:03.623 回答
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' (quoted) 替换匹配行中文本的第一个引用部分。

http://www.catonmat.net/blog/wp-content/uploads/2008/09/sed1line.txt上的文档(谷歌热门的“sed one liner”对于快速调度这类任务非常有帮助。

于 2013-07-17T13:26:14.720 回答