如果字符串出现在较早的位置,则使用 sed 编辑字符 65-79

如果字符串出现在较早的位置,则使用 sed 编辑字符 65-79

我正在尝试弄清楚如何使用 sed (我意识到我可以使用其他工具,但我想知道如何在 sed 中执行此操作,如果它在另一个工具中确实更有意义,请告知)来编辑包含像这样的行:

1234561234567809912345612345678    00000999988STRING ONE        EX30 0600000001 K XXYY
1122331122334409922334466554433    00000123499STRING TWO        EX99 0600000002 K XXYY

以及许多其他不同格式的行。

字符串STRING ONESTRING TWO位于位置 47-64(包括其后面的空格)。

我想根据位置 47-64 的内容将位置 65-80 中的文本更改为另一个值。

因此,对于 STRING ONE 行,字符 65-80 将修改为“AAAABBBBCCCC”(4 个尾随空格)。

在 STRING 2 行中,字符 65-80 将修改为“XXXYYYZZZ”(4 个尾随空格)。

到目前为止我已经做到了:

sed 's/^\(.\{64\}\)EX/\1234567890 /'

它将把字符 65 处的“EX”替换为“234567890”,但这

  • 不考虑选择正确的线路(使用“字符串一”或“字符串二”)
  • 仅替换“EX”

还有其他一些我在这里没有关注的事情。

  • 为什么开括号和反斜杠大括号之间有点?
  • 为什么在 1 前面加上反斜杠(这似乎是必要的,但会导致 1 不在替换字符串中)?

我希望我可以使用 grep 并操作输出到临时文件或环境变量来完成此操作,但很高兴知道我是否可以更优雅地完成此操作。

答案1

.在模式中表示“任何字符”。.\{64\}表示“64 个字符”,其中任意一个。

\1是对第一个匹配组的反向引用,即由第一对\(...\)括号匹配的组。要插入文字1,不要在前面加上反斜杠。

您可以在 sed 中使用“地址”将命令限制为仅某些行,例如

sed '/^.\{46\}STRING ONE \{8\}/s/^\(.\{64\}\).\{16\}/\1AAAABBBBCCCC    /'

上面写着如果该行以 46 个字符开头,后跟STRING ONE和 8 个空格,请记住 中的前 64 个字符\1,并将它们和后面的 16 个字符替换为记住的字符,后跟AAAABBBBCCCC和 4 个空格。

要添加更多带地址的命令,请用分号分隔它们或使用多个-e开关:

sed -e '/address1/s/pattern1/replacement1/;/address2/s/pattern2/replacement2/'
sed -e '/address1/s/pattern1/replacement1/' -e '/address2/s/pattern2/replacement2/'

相关内容