![根据样式指南替换大量文件](https://linux22.com/image/1331699/%E6%A0%B9%E6%8D%AE%E6%A0%B7%E5%BC%8F%E6%8C%87%E5%8D%97%E6%9B%BF%E6%8D%A2%E5%A4%A7%E9%87%8F%E6%96%87%E4%BB%B6.png)
我想对我们的测试进行全面重新格式化,并且正在清理一些不一致的大小写。我正考虑使用 来执行awk
此操作,因为sed
它有点不足,而且我需要提前查看我的情况。具体来说,对于给定文件中的每一行,我希望发生以下情况:
查找单词
it
、describe
、 或context
,后跟一个空格,后跟一个单引号或双引号,后跟一个大写字母。如果匹配,则用整个匹配字符串的小写版本替换匹配项,但仅限于匹配的字符串(不要将同一行上的其他内容小写)。
如果单引号或双引号后的字符串是“GET”、“POST”、“PUT”或“DELETE”之一,则不匹配。
例如:
describe 'apple banana' ----> (no change)
describe 'APPLE BANANA' ----> describe 'aPPLE BANANA'
describe 'Apple Banana' ----> describe 'apple Banana'
describe "Apple Banana" ----> describe "apple Banana"
describe 'one TWO' ----> (no change)
context 'POST BANANA' ----> (no change)
context 'XPOST BANANA' ----> context 'xPOST BANANA'
我应该使用什么awk
参数和/或其他命令?(如果需要多次传递才能完成,我也没意见。)
答案1
免责声明:
此解决方案将删除被替换行上的所有“额外”空格。例如……:
describe 'Apple Banana'
...将被替换为:
describe 'apple Banana'
但是,“额外”的空格在...:
context "GET BANANA"
...不会被刪除。
这是所要求的一个示例awk
(请注意,您可以在一行上执行该命令。换行符只是为了在超级用户上引起视觉吸引力):
cat someTextFile.txt | awk '{ \
if( \
($1=="describe" || $1=="it" || $1=="context") \
&& (substr($2,0,1)=="\"" || substr($2,0,1)=="'"'"'") \
&& !(substr($2,2,length($2)-1)=="POST" \
|| substr($2,2,length($2)-1)=="GET" \
|| substr($2,2,length($2)-1)=="PUT" \
|| substr($2,2,length($2)-1)=="DELETE") \
){ \
subStr=substr($2,0,1); \
subStr2=tolower(substr($2,2,1)); \
restStr=substr($2,3,length($2)-1); \
print $1" "subStr""subStr2""restStr" "$3 \
}else{ \
print \
} \
}'
输出:
describe 'apple banana'
describe 'aPPLE BANANA'
describe 'apple Banana'
describe "apple Banana"
describe 'one TWO'
context 'POST BANANA'
context 'xPOST BANANA'
编辑:这是没有换行符的命令cat someTextFile.txt | awk '{ if( ($1=="describe" || $1=="it" || $1=="context") && (substr($2,0,1)=="\"" || substr($2,0,1)=="'"'"'") && !(substr($2,2,length($2)-1)=="POST" || substr($2,2,length($2)-1)=="GET" || substr($2,2,length($2)-1)=="PUT" || substr($2,2,length($2)-1)=="DELETE") ){ subStr=substr($2,0,1); subStr2=tolower(substr($2,2,1)); restStr=substr($2,3,length($2)-1); print $1" "subStr""subStr2""restStr" "$3}else{print}}'
如果您希望将输出写入新文件,只需> output.txt
在命令末尾添加。
如果您希望在多个文件上执行此操作并将结果存储在一个文本文件中,只需将其替换为在要格式化的文件上执行的命令,cat someFile.txt
例如或cat
cat *log*
cat $(find /some/path -name "*log*")
编辑编辑:非常感谢 Scott 的反馈!