【发布时间】:2022-03-26 07:24:06
【问题描述】:
我正在尝试用 bash 将多个文件中每 4 次出现的“_”替换为“@”。
例如
foo_foo_foo_foo_foo_foo_foo_foo_foo_foo..
会变成
foo_foo_foo_foo@foo_foo_foo_foo@foo_foo...
#perl -pe 's{_}{++$n % 4 ? $& : "@"}ge' *.txt
我已经尝试过 perl,但问题是它会替换从最后一个文件开始的每 4 个 _。因此,例如,某些文件的第一个 _ 被替换,因为它不是以计数 0 开始每个新文件,而是从前一个文件继续。
我试过了:
#awk '{for(i=1; i<=NF; i++) if($i=="_") if(++count%4==0) $i="@"}1' *.txt
但这也行不通。
使用 sed 我无法找到一种方法来继续替换每 4 次出现,因为每个文件中有不同数量的 _。有些文件有 20 _,有些有 200 _。因此,我无法指定范围。
我真的不知道该怎么办,有人可以帮忙吗?
【问题讨论】:
-
假设您的文件每个包含多于 1 行 - 您要替换每行中每 4 次出现的位置还是整个文件?请提供minimal reproducible example,其中包含多于 1 行的样本输入(即没有省略号)和相关的预期输出,以真正展示您的要求。还要说明您的输入文件是否足够小以适合内存,或者我们不能假设。