sed 명령 regexp group을 사용하여 그룹에서 $() 부분으로 데이터를 전달하는 방법

sed 명령 regexp group을 사용하여 그룹에서 $() 부분으로 데이터를 전달하는 방법

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도 날짜가 유효하지 않다고 불평합니다. 한 번만: 처음에, 모든 줄에 적용되지는 않습니다.

따라서 perlor bash보다 나은 선택입니다 sed.

답변2

as 수정자를 GNU sed사용하여 sed 명령을 호출한다고 가정합니다 . 입력 데이터를 공유하지 않았으므로 아마도 15자보다 길 것으로 가정합니다./es///

sed -E 's/^(.{15})(.*)/echo "$(date -d "\1" "+%s")\2"/e' /var/log/mail.log

관련 정보