【问题标题】:sed, insert whitespace at the Nth position after a delimitersed,在分隔符后的第 N 个位置插入空格
【发布时间】:2021-05-05 07:03:48
【问题描述】:

我不是很流利地使用 bash 尤其是 sed 命令: 我正在尝试使用 sed 在以下字符串中的每个空格之后的第二个位置插入另一个空格

Id_26300, 0404 0202 0202 0202

为了获得:

Id_26300, 04 04 02 02 02 02 02 02

我需要在我的整个文本文件中从第 3 行到最后执行此操作:

FileName
InfoField A B C D
Id_26300, 04 04 02 02 02 02 02 02
Id_26301, 02 02 02 04 02 04 02 02
...

我试图找到解决方案,但无法...非常感谢您的帮助!

【问题讨论】:

  • 不确定为什么这个问题已经关闭似乎足够集中。也许尝试(GNU sed)sed -E '3,${:a;s/(, *([0-9]{2} )*[0-9]{2}\B)/\1 /;ta}' file 如果问题重新打开,我会给出解释。
  • 非常感谢,这行得通!我很想知道这个选项的解释。再次感谢!

标签: bash sed delimiter


【解决方案1】:

鉴于输入有限:

sed '3,$s/ ../& /g'

从第 3 行到文件 3,$ 的末尾,匹配一个空格,后跟任意 2 个字符 ..。使用& 表示“匹配的内容”并在其后添加一个空格。重复使用g

【讨论】:

  • 非常感谢你们俩!这两种解决方案都有效。我将其标记为已接受的答案,因为它更简单:-)
【解决方案2】:

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

sed -E '3,${:a;s/, *([0-9]{2} )*[0-9]{2}\B/& /;ta}' file

从第三行到文件末尾,匹配从第一个字段分隔符,,任意数量的空格,零个或多个2位数字的集合,后跟一个空格,后跟2位数字,后面不跟一个单词边界并将其替换为匹配项和空格。如果替换成功,重复直到失败。

注意这仅在第一个字段(可能包含空格)之后替换。如果前 2 行如图所示,范围可能会被忽略,因此此解决方案只会专门更改第一个字段后仅包含数字的行:

sed -E ':a;s/, *([0-9]{2} )*[0-9]{2}\B/& /;ta' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多