【问题标题】:Skipping a part of a line using sed使用 sed 跳过一行的一部分
【发布时间】:2021-02-03 11:28:47
【问题描述】:

我有一个内容像这样的文件 - @1: 00001109 每一行都是相同的格式。我希望最终输出为@1: 00 00 11 09

我在 sed 中使用命令每 2 个字符引入一个空格 - sed 's/.\{2\}/& /g'。但这也会给我在冒号之前的部分留出空格,这是我想避免的。谁能建议如何进行?

【问题讨论】:

    标签: regex linux awk sed scripting


    【解决方案1】:

    如果perl 恰好是您的选择,那么:

    perl -pe '1 while s/(\d+)(\d\d)/$1 $2/g' file
    

    【讨论】:

      【解决方案2】:

      你可以使用纯 bash:

      for line in "$(<your_file.txt)"; do
          first=`echo $line | cut -d' ' -f1`" "
          last=`echo $line | cut -d' ' -f2`
          for char in `seq 0 2 ${#last}`; do
              first+=${last:$char:2}" "
          done;
      done;
      

      【讨论】:

        【解决方案3】:

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

        sed 's/[0-9][0-9]\B/& /g' file
        

        在单词中的一对数字之后,插入一个空格。

        【讨论】:

          【解决方案4】:

          您能否尝试使用所示示例进行以下、编写和测试。

          awk '{gsub(/../,"& ",$2);sub(/ +$/,"")} 1' Input_file
          

          解释:首先全局替换每个具有相同值的 2 位数字对,方法是向其附加空格,其中 gsub 是全局替换以全局执行)。完成此操作后,使用单个 sub 将最后出现的空格替换为 NULL,以避免行末出现空格。



          sed:

          sed -E 's/[0-9]{2}/& /g;s/ +$//'  Input_file
          

          解释: 将每对数字全局替换为相同的值并附加空格。然后用 NULL 替换行的最后一个空格(由先前的替换添加)的空格。

          【讨论】:

          • 你能解释一下它是如何跳过冒号之前的部分的吗?我没有完全理解。
          • @Nibhrit,当然,你的字符串 @1: 00001109 是空格分隔的,awk 默认字段分隔符是空格,所以你的数字部分出现在第二个字段中,我只在第二个字段中执行替换因此第一个带有冒号的字段永远不会受到影响,如果有更多疑问,请告诉我,干杯。
          猜你喜欢
          • 2010-11-07
          • 1970-01-01
          • 1970-01-01
          • 2022-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-09
          相关资源
          最近更新 更多