sed 명령을 사용하여 mail.log의 날짜를 타임스탬프 형식으로 변경하고 싶습니다. $() 내에서 그룹에서 날짜 명령으로 \1을 전달하는 데 문제가 있습니까?
sed -E "s/(^.{15})/$(date -d "\1" "+%s")/" /var/log/mail.log
답변1
인용과 확장에 대한 강의입니다 :-)
"s/(^.{15})/$(date -d "\1" "+%s")/"
따라서 인수는 다음을 연결한 것입니다.
's/(^.{15})/$(date -d '
, 그대로 전달됨\1
, 쉘에 의해 해석됨- ""(단일 공백)은 그대로 전달됩니다.
+%s
쉘로 해석됨)/
이는 있는 그대로 전달됩니다.
당신이 원하는 것은 :
s/(^.{15})/$(date -d "\1" "+%s")/
날짜 부분은 셸에 의해 확장됩니다.
이를 달성하는 방법에는 두 가지가 있습니다. 창의적인 인용문:
"s/(^.{15})/$(date -d '\1' '+%s')/"
또는 울타리:
"s/(^.{15})/$(date -d \"\1\" \"+%s\")/"
date
그러나 이는 파일의 각 줄이 아닌 명령줄 확장에서 실행되기 때문에 여전히 작동하지 않습니다 . 그래서 그것을 date
보는 것만으로 \1
도 날짜가 유효하지 않다고 불평합니다. 한 번만: 처음에, 모든 줄에 적용되지는 않습니다.
따라서 perl
or bash
보다 나은 선택입니다 sed
.
답변2
as 수정자를 GNU sed
사용하여 sed 명령을 호출한다고 가정합니다 . 입력 데이터를 공유하지 않았으므로 아마도 15자보다 길 것으로 가정합니다./e
s///
sed -E 's/^(.{15})(.*)/echo "$(date -d "\1" "+%s")\2"/e' /var/log/mail.log