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;
直到第一个的所有内容(当前正在读取的内容),并且将清空模式空间,以便我们可以再次开始该过程。这些记录在:\n
D
man 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 =
,然后是另一段非- =
。告诉-o
grep 仅打印该行的匹配部分,因此结果是打印您正在查找的组。
另一种选择是使用awk
with=
作为输入字段分隔符,并成对打印字段:
$ 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///
命令在插入换行符时没有问题。