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

Bash-替换目录中所有文件中的字符串,bash,replace,text-files,batch-processing,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(40

我在一个目录中有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'
要创建新的时间戳,所有文件的时间戳都相同。当前时间戳未知(我的意思是当前文件中存在的值,在本例中为“201307144702”)

所以我需要(对于目录中找到的每个文件):

  • 查找从ODI_SESJA_ID开始的行
  • 将“ODI_SESJA_ID常量”后的值替换为新值
  • 文件中的其余行应保持不变

使用bash执行此操作的最佳方法是什么?我应该使用sed或类似的工具吗?怎么做

我会使用sed这样做:

sed -i "/^[ \t]*ODI_SESJA_ID CONSTANT/s/'[^']\+'/'REPLACEMENT'/" *.ctl
sed的-i标志意味着它在适当的位置修改文件,因此我通常首先在单个文件上使用-e标志而不是-i标志进行尝试,并确认sed的输出就是我所要寻找的

说明:

  • 双引号保护我的正则表达式不受shell的影响
  • /^[\t]*ODI_SESJA_ID CONSTANT/
    仅匹配以空格开头,后跟“ODI_SESJA_ID CONSTANT”的行
  • s/'[^']\+'/'REPLACEMENT'/
    用“REPLACEMENT”(引号)替换匹配行中文本的第一个引号部分

  • 谷歌最热门的“sed one liners”文档非常有助于快速分派此类任务。

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

    sed -i 's/.*ODI_SESJA_ID.*/             ODI_SESJA_ID CONSTANT "'$(date +%s)'",/' *.ctl
    
    它将包含ODI_SESJA_ID的行替换为新值。这不是很优雅,因为它替换了整行,而不是只替换需要处理的值。

    类似于:

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


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

    不适用于我…没有错误但也没有影响,文件似乎未被触及