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
input 이 있다고 가정하면 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 =
, 또 다른 부분이 아닌 부분을 찾습니다 =
. grep에게 줄의 일치하는 부분만 인쇄하도록 지시 -o
하면 결과는 찾고 있는 그룹이 인쇄됩니다.
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
먼저 =
패턴 공간의 모든 문자를 개행 문자로 바꿉니다. 그런 다음 첫 번째 개행 문자를 로 바꾸고 =
패턴 공간의 초기 부분(최대 첫 번째 개행 문자까지)을 인쇄한 다음 인쇄된 부분을 제거합니다. 그런 다음 나머지 데이터로 루프를 다시 시작합니다.
Telden의 답변GNU가 있으면 사용은 하겠지만 sed
포팅은 불가능합니다.끼워 넣다s///
표준 명령을 사용하면 줄 바꿈이 가능합니다 sed
. 그러나 표준 y///
명령에서는 개행 문자를 삽입하는 데 문제가 없습니다.