我有很多文件,我想只编辑那些以private
开头的行。
原则上我想
gawk '/private/{gsub(///, "_"); gsub(/-/, "_"); print}' filename
,但这只打印文件修改的部分,而不是全部。
- gawk是否有类似
sed -i
的方法? - 或者
sed
或gawk
是否有更简单的方法来完成上述值?
只需将最终打印内容移出过滤后的图案。如:
gawk '/private/{gsub(///, "_"); gsub(/-/, "_")} {print}'
通常简化为:
gawk '/private/{gsub(///, "_"); gsub(/-/, "_")}1'
您真的、真的、真的(强调"真的")不想使用sed -i
之类的东西来"就地"编辑文件。(我把"in place"在引号中,因为gnu的sed不会编辑文件,而是创建具有相同名称的新文件。)这样做会导致数据损坏,如果您有很多文件,您不想冒这个风险。只需将文件写入一个新的目录树。这将使恢复更简单。
,
d=backup/$(dirname "$filename")
mkdir -p "$d"
awk '...' "$filename" > "$d/$filename"
考虑一下您是否使用了-i
之类的东西,它将备份文件放在相同的目录结构中。如果正在批量修改文件,并且进程中途停止,如何恢复?如果你是把输出到一个单独的树,复苏是微不足道的。您的原始文件是原始的,并且没有任何问题,如果您的过滤过程过早终止或无意中多次运行。sed -i
是人类的瘟疫,不应该被使用。不要传播瘟疫。
4.1.0版本的GNU awk
具有原地定位能力。
你应该把print
放在reg match块的外面。
试试这个:
gawk '/^private/{gsub(/[/-]/, "_");} 1' filename
或者,确保你备份了文件:
gawk -i inplace '/^private/{gsub(/[/-]/, "_");} 1' filename
你忘记用^
来表示start
,你需要用它来改变以private
开头的行,否则所有包含private
的行都会被修改。
是的,你可以把两个gsub
组合成一个。
执行相同操作的sed
命令为:
sed '/^private/{s/[/-]/_/g;}' filename
测试完成后添加-i
选项