如何搜索/替换单个内联sed/awk?



我有很多文件,我想只编辑那些以private开头的行。

原则上我想

gawk '/private/{gsub(///, "_"); gsub(/-/, "_"); print}' filename

,但这只打印文件修改的部分,而不是全部。

  • gawk是否有类似sed -i的方法?
  • 或者sedgawk是否有更简单的方法来完成上述值?

只需将最终打印内容移出过滤后的图案。如:

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选项

最新更新