【问题标题】:sed command does not work for certain characters in unixsed 命令不适用于 unix 中的某些字符
【发布时间】:2016-05-02 08:03:06
【问题描述】:

我正在尝试替换第 300 个字符并相应地添加带小数点的正号。 Sed 命令对除 B、F 和 { 之外的所有字符都非常有效。

请在下面找到输入数据:

result_PHDPTRAR2.txt

H009704COV2009084    PHD0000001H009700204COV2009084    PROD2015122016010418371304COVH009704COV2009084    PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E0000001880498A9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000            00000140              0000000000000{0000000000773B0000000000000{000000000000

这里的第 300 个字符是 A。如果我们使用下面的 sed 命令,它可以正确地满足上述要求:

sed -e 's/\(.\{1,255\}\)\(.\{1,34\}\)\(.\{1,9\}\)\(.*\)A/\1\2+\3.\4^/' <<< cat result_PHDPTRAR2.txt

它将A替换为^并得到以下结果。

H009704COV2009084    PHD0000001H009700204COV2009084    PROD2015122016010418371304COVH009704COV2009084    PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E000+000188049.8^9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000            00000140              0000000000000{0000000000773B0000000000000{000000000000

但是如果我们将第 300 个字符替换为 B、F 或 {,则相同的命令不起作用。

如果我用 B 更改输入的第 300 个字符(result_PHDPTRAR2.txt),然后如果我使用 sed

sed -e 's/\(.\{1,255\}\)\(.\{1,34\}\)\(.\{1,9\}\)\(.*\)B/\1\2+\3.\4^/' <<< cat result_PHDPTRAR2.txt

我得到以下结果:

H009704COV2009084    PHD0000001H009700204COV2009084    PROD2015122016010418371304COVH009704COV2009084    PTR0000001H0097002C00000000140000000043610000003408092A0000000068061C0000000000000{0000002939340H0000000537585H0000003476926F0000001218378G0000000040292E0000000016497{0000000000827E000+000188049.8B9000000320436J000000004391000000001606000000000030000000000128000000000006000000004227000000000000000000000000            00000140              0000000000000{0000000000773^0000000000000{000000000000

您可以在 "+000188049.8B" 中找到+ 和小数点添加正确,但 B 保持不变。这里的 B 应该替换为 ^

谁能帮帮我?

【问题讨论】:

  • 请发布预期的输出并重新表述问题以使其清楚
  • 我现在已经添加了预期结果

标签: unix sed


【解决方案1】:

问题是输入中的第一个“B”字符晚于 4..300 字符。 IE。输入文本与您的期望不符。

那么,现在呢?

更新

根据评论,问题是文本中第 300 个字符后的 B 多于 1 个。 .* 将达到这一点。这是修复它的方法:

 sed -e 's/\(.\{1,255\}\)\(.\{1,34\}\)\(.\{1,9\}\)\([^B]*\)B/\1\2+\3.\4^/'

注意否定字符类:\([^B]*\)B - 将上升到第一个 B。不幸的是,sed 没有非贪婪量词。这样会更容易:\(.*?\)B

【讨论】:

  • 在使用 sed 命令之前,我们需要将 result_PHDPTRAR2.txt 中的第 300 个字符更改为 B
  • 噢,我明白了。对于 \4,您需要一个非贪婪匹配器。更新答案。
  • 如果我们使用 perl 命令而不是 sed,我们可以使用相同的格式吗?我需要考虑一个不同的选择,因为当输入文件很大(大约 80000 条记录)时,sed 的处理时间需要更多
  • 我曾尝试将命令用作 perl -pe 's/(.\{1,255\})(.\{1,34\})(.\{1,9\}) ([^B]*)B/\1\2+\3.\4^/' 。但它没有给出正确的答案。我们可以在这里使用 perl 代替 sed 吗?
  • 尝试使用$1$2 等反向引用,而不是\1\2。当然我们可以使用 perl - 但你需要小心地移植正则表达式。
猜你喜欢
  • 2019-05-24
  • 1970-01-01
  • 2018-03-31
  • 2021-06-17
  • 2022-01-11
  • 2017-11-19
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多