我在目录中有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')。
所以我需要(对于目录中的每个文件):
使用bash执行此操作的最佳方法是什么?我应该使用sed还是类似的工具?怎么样?
答案 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的输出是我正在寻找的。
说明:
/^[ \t]*ODI_SESJA_ID CONSTANT/
仅匹配以空格开头,后跟'ODI_SESJA_ID CONSTANT'的行。s/'[^']\+'/'REPLACEMENT'/
将'REPLACEMENT'(引用)替换为匹配行上文字的第一个引用部分。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的行替换为新值。不是很优雅,因为它取代了整行,而不仅仅是需要处理的值。