Bash-替换目录中所有文件中的字符串
我在一个目录中有31个.ctl文件,它们如下所示: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
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的输出就是我所要寻找的
说明:
/^[\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
。不适用于我…没有错误但也没有影响,文件似乎未被触及