Bash 一行代码屏蔽文件中的数据

2 bash awk sed

我有一个相当大的文件。我需要屏蔽特定位置和特定记录类型中的所有字符。我已经到处搜索,但找不到这个非常简单的任务的解决方案。这是一个例子

文件名: 你好.txt

文件:

0120140206INPUT FILE
1032682842 MR SIMPSON
20231458 742 Evergreen Terrace
3034560817 GREEN
1032682842 MR GRIFFIN
20231458 Spooner Street
3034560817 RED
3001 
Run Code Online (Sandbox Code Playgroud)

我想做的是屏蔽以“10”开头的所有行的位置 12-16。像这样:

0120140206INPUT FILE
1032682842 XXXXXMPSON
20231458 742 Evergreen Terrace
3034560817 GREEN
1032682842 XXXXXIFFIN
20231458 Spooner Street
3034560817 RED
3001
Run Code Online (Sandbox Code Playgroud)

BMW*_*BMW 5

使用 sed

sed -r '/^10/ s/^(.{11}).{5}/\1XXXXX/' file

0120140206INPUT FILE
1032682842 XXXXXMPSON
20231458 742 Evergreen Terrace
3034560817 GREEN
1032682842 XXXXXIFFIN
20231458 Spooner Street
3034560817 RED
3001
Run Code Online (Sandbox Code Playgroud)

解释

  • -rsed 中有用的选项,--regexp-extended
  • /^10/搜索以 10 开头的行。
  • s/^(.{11}).{5}/\1XXXXX/ 掩码位置 12-16 至 XXXXX

同样的想法,如果你的awk是gawk,并且支持gensub()功能:

awk '{$0=gensub(/^(10.{9}).{5}/,"\\1XXXXX",$0)}1' file
Run Code Online (Sandbox Code Playgroud)

更新:@tripleee 提供了一个较短的:

sed -r 's/^(10.{9}).{5}/\1XXXXX/' file
Run Code Online (Sandbox Code Playgroud)

  • 或者只是 `sed -r 's/^(10.{9}).{5}/\1XXXXX/' hello.txt` (2认同)