다음은 샘플 텍스트 파일입니다.
store: xxx
Delete: xxx
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store: xxx
Delete: xxx
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store: abc
store: sdf
Expires: Sat, 30 Oct 02021 13:01:57 +0100
store
세 개의 필드( , , )를 모두 CSV 형식으로 원합니다Delete
.Expires
Delete
또는 줄/문자열 이 없으면 또는 쉼표로 구분된 공백Expires
으로 표시되어야 합니다.null
- 잘라낼 날짜 필드는 다음과 같습니다
DD Mon YYYY
.30 Oct 2001
지금까지 도움을 받아 다음을 얻었지만 예상대로 작동하지 않습니다.
어떤 도움이라도 대단히 감사하겠습니다.
cat list.txt | grep -E "Expires|Delete|Store" | awk '{ printf "%s\n", $2 }' | tr '\n' ',' | sed 's/,,/\n/' | sed '$ s/.$//'
답변1
귀하가 하려는 작업이 무엇인지(왜 X-Delete-At
, 왜 Object:
, 누락된 필드를 어떻게 처리하시겠습니까?) 이해할 수 없으므로 sed
유일한 해결책을 제안합니다.
sed -nE '/Expires:/{s/: [^,]*,/:/;s/0([0-9]{4})/\1_/}
/store/!{H;$!d;}
x;s/.*store: ([[:alnum:]]*)[^>]*[> ]*(Delete: ([[:alnum:]]*)[^>]*[> ]*)*(Expires: ([^_]*))*.*/\1,\3,\5/p
$!d
x;s/.*store: ([[:alnum:]]*).*/\1,,/p' /tmp/list.txt
아이디어는 다음 store:
라인까지 예약된 공간에 필드를 수집한 후 x
버퍼를 변경하여 다음 store:
라인이 이미 버퍼에 있고 수집된 필드를 출력용으로 포맷할 수 있도록 하는 것입니다.
비결은 복잡한 정규식에 있습니다. 선택적 필드는 내부에 배치되어 ()*
여러 번 나타날 수 있습니다. 전혀 나타나지 않으면 전체 정규식은 여전히 일치합니다.
쓰레기를 먹고 선택적 필드를 먹지 않기 위해 로 시작하는 줄을 사용하는 [^>]*
대신 선택했습니다 ..*
>
첫 번째 줄은 날짜 형식을 다시 지정하는 데 사용됩니다. 마지막 두 줄은 store:
파일이 한 줄로 끝나는 경우를 처리합니다.