计算并返回文件中使用 sed 完成的替换次数

My *_*ork 7 sed text-processing

我有一个很大的 JSON 文件,我想用其中的一个字符串替换另一个字符串。不应该,但可能会在我不想替换它的上下文中使用该字符串。

我知道它在正确上下文中的文件中出现了多少次,因此我还想打印该字符串的出现次数被替换为sed. 我怎样才能做到这一点?

为了查找和替换我使用的字符串:

sed -i "" "s/my_string/new_string/g" my_file.json
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是 mac,但我也需要 Linux,例如:

sed -i "s/my_string/new_string/g" my_file.json
Run Code Online (Sandbox Code Playgroud)

我知道我可以运行 agrep来查找文件中的字符串并返回计数,如下所示:

grep -o my_string my_file.json | wc -l
Run Code Online (Sandbox Code Playgroud)

但这不是我要问的。我问是否有一种方法可以像任何文本编辑器(word,记事本,geany,...)那样做 - 如果我给出一个字符串,它会告诉我它看到这个字符串并替换它的次数和另外一个。

更多信息——它将在 Bash 脚本中运行,因此如果有其他更好的方法,我对此持开放态度。

ter*_*don 7

就用perl代替吧。它几乎和 和 替换运算符一样可移植sed(在这种情况下更可移植perl,因为语法在任何已安装的机器上都是相同的)-i,并且可以被告知打印替换数量:

perl -i  -lpe '$k+= s/my_string/new_string/g; END{print "$k"}' my_file.json
Run Code Online (Sandbox Code Playgroud)

这将就地进行替换并将替换数打印到标准输出。

  • +1。更好的是,使用 perl 及其 [JSON](https://metacpan.org/release/JSON) 库模块。@MyWork,提取、删除或更改 json 等结构化文本中的数据应该使用解析器来完成,而不是单独使用正则表达式。 (2认同)

gue*_*t_7 6

如果您必须使用 sed 那么一种方法可能是

根据@Phillipos 的建议,将其更改为:

sed -i "" -e '
  s/my_string/new_string\
/g;s/\n//w /dev/stdout
  s///g
' my_file.json | wc -l
Run Code Online (Sandbox Code Playgroud)
  • 在每次出现 my_string 之后放置一个换行符 + 也进行更改。
  • 然后去掉一个换行符,因为 sed 在打印时隐式地添加了一个换行符。
  • 仅当替换成功时,才会有条件地写入 stdout,即该行包含 my_string mng 时
  • 然后我们去掉换行标记。