【问题标题】:How can I mask 200 characters of each line in a file with 3000 long lines?如何屏蔽 3000 行长的文件中每行的 200 个字符?
【发布时间】:2025-12-02 05:40:01
【问题描述】:

我有一个固定宽度的文本数据文件。每行长度为 3000 个字符。我需要屏蔽(更改为“X”)位置 1000 和 1200 之间的所有字符。文件中没有分隔符,每个字段都通过其在行中的位置来知道。

如果我只需要更改 10 个字符,我可以使用 sed

sed -i -r 's/^(.{999}).{10}(.*)/\1XXXXXXXXX\2/'

但是用 200 个X 编写一个sed 命令似乎不是一个好主意。

我尝试使用 awk,但由于数据中的空格,它会为某些行返回不同的值。

【问题讨论】:

标签: bash sed


【解决方案1】:

但是用 200 个 X 编写一个 sed 命令似乎不是一个好主意。

不管怎样,我们还是写吧:

sed -E 's/^(.{999}).{200}/\1'"$(yes X | head -n200 | tr -d '\n')"'/'

因为恰好1000 % 200 == 0,我想我们也可以:

sed -E 's/.{200}/'"$(yes X | head -n200 | tr -d '\n')"'/6'

【讨论】:

  • 玩弄我从您的回答和“duplicate”问题中学到的知识:sed -r "s/(.{999}).{200}(.*)/\1$(printf 'X%.0s' {1..200})\2/"
  • 这又是一个好作品!您可以删除结尾的 (.*)/2 - 它匹配所有内容并替换所有内容,可以删除。
【解决方案2】:

为了提高完成工作的能力,我的首选工具是sedawkpython。您可能需要考虑加紧:-)

无论如何,这个可以通过一些初始设置在awk 中完成,例如:

BEGIN {x="XXXXXXXXXX"; x=x""x""x""x""x; x=x""x""x""x}

这给了你(10,然后是 50,然后)200 个 X。

然后你可以随便摆弄$0,这是整行不管的间距。根据您所说的“位置 1000 和 1200 之间”的实际含义,下面的数字可能略有不同,但您应该明白:

{ print substr($0,1,999)""x""substr($0,1200) }

您可以在下面的 sn-p 中看到这将如何表现,替换每行上的字符位置 3 到 6:

pax> printf "hello there\ngoodbye\n" | awk '
...>    BEGIN {x="X";x=x""x;x=x""x}
...>          {print substr($0,1,2)""x""substr($0,7)}'

heXXXXthere
goXXXXe

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -E '1{x;:a;/^x{200}/!s/^/x/;ta;x};G;s/^(.{999}).{200}(.*)\n(.*)/\1\3\2/' file
    

    用一个包含 200 个x 的字符串来填充保存空间。将保留空间附加到当前行并使用替换将预期的字符串替换为掩码。

    【讨论】:

      最近更新 更多