根据日期分割线

根据日期分割线
Thu_Jun_04_09:22:50_2020=abcd:some_string=Thu_Jun_04_09:39:54_2020=efgh:some_string=Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

我有上面的输出,但我想要以下格式。

Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

有什么方法可以根据日期分割线。

答案1

假设您有输入file,您可以执行以下操作(GNU sed):

$ sed 's/=/\n/2;P;D' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

会将s/=/\n/2第二个替换=\n换行符。然后,将打印当前模式空间中P;直到第一个的所有内容(当前正在读取的内容),并且将清空模式空间,以便我们可以再次开始该过程。这些记录在:\nDman sed

   D      If pattern space contains no newline, start a normal  new  cycle
          as  if  the d command was issued.  Otherwise, delete text in the
          pattern space up to the first newline, and  restart  cycle  with
          the  resultant  pattern space, without reading a new line of in‐
          put.
   P      Print  up  to  the first embedded newline of the current pattern
          space.

或者,使用 GNU grep,您可以执行以下操作:

$ grep -oP '[^=]+=[^=]+' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

这将查找一段非-=字符,然后是 a =,然后是另一段非- =。告诉-ogrep 仅打印该行的匹配部分,因此结果是打印您正在查找的组。


另一种选择是使用awkwith=作为输入字段分隔符,并成对打印字段:

$ awk -F= '{for(i=2;i<=NF;i+=2){print $(i-1)"="$i}} ' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

答案2

$ tr '=' '\n' <file | paste -d '=' - -
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

首先=使用 ,用换行符替换所有字符tr,然后使用 ,将其重新格式化为两列,并=作为分隔符paste


与标准sed

$ sed -e 'y/=/\n/' -e 's/\n/=/;P;D' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

这首先用=模式空间中的换行符替换所有字符。然后它用 替换第一个换行符=,打印模式空间的初始部分(直到第一个换行符),然后删除打印的部分。然后它用剩余的数据重新开始循环。

特尔登的回答如果你有 GNU ,你会使用它sed,但不可能移植插入s///带有标准命令的换行符sed。然而,标准y///命令在插入换行符时没有问题。

相关内容