我正在寻求自动化一个过程,其中文件名的一部分用于替换文件本身内的值。
目前我使用的手动流程如下所示:
得到组织名称手动
$ grep -o orgname......... *2017-04* |uniq
...
uname=123456&**orgname=ABC5678**&userType=PERSISTENT&userLoginName=someusername&eventType=FAILED_LOGIN_ATTEMPT&timeOfOccurrence=2017-03-12%2016%3A49%3A36
然后更换组织名称用新名字
$ sed -i 's/ABC1234/5678/g' `*`5678`*` ; sed -i 's/DEF2345/6789/g' `*`6789`*`; sed -i etc...
最终结果如下所示:
uname=123456&orgname=**1234**&userType=PERSISTENT&userLoginName=someusername&eventType=FAILED_LOGIN_ATTEMPT&timeOfOccurrence=2017-03-12%2016%3A49%3A36
这些文件的命名如下:
rsa.collect.rsa-IB_L**1234**-2017-03-12.log.web1.decrypt
不管以后是什么组织名称=需要从 ABC5678 更改为 Lxxxx 后面的任何内容,仅在文件名中具有相同 xxxx 的文件中。
我很难理解如何从文件名中提取该数字并在sed
.有数百个文件(每个文件都有自己的日期)和 6 个不同的数字对可供使用。我希望编写一个 bash 脚本来一次性完成这一切。
我试图grep -P
结合使用,将其放入某种变量中并使用,sed
但也许有更好/更简单的方法?
如果还有任何其他问题,请告诉我。
答案1
一旦文件名位于变量中,您就可以使用 shell参数扩展运算符提取其中的一部分。然后将其代入sed
命令中。下面我使用子字符串运算符获取从位置 20 开始的 4 个字符。
for file in rsa.collect.rsa-IB_L*.log.web1.decrypt; do
orgname=${file:20:4}
sed -i "s/orgname=[^&]*/orgname=$orgname/" "$file"
done