양식에 표현식이 있는데 @(<date calculation>)
이를 결과로 바꾸고 싶습니다 date +%s --date "now<date calculation>"
. 예를 들어 @(-1 day)
결과는 로 대체됩니다 date +%s --date "now -1 day"
.
표현식은 한 줄의 텍스트에 포함되어 있으며 여러 개를 가질 수 있습니다. 예를 들어 echo hi @(-1 day) bye "@(-1 hour)"
. 평가 결과는 이렇습니다 echo hi 1491848561 bye "1491931365"
. 그래서 저는 단지 표현을 평가하고 싶습니다.
나는 GNU의 sed 'e' 명령을 사용해 보았지만 sed -r 's|@\(([^)]*)\)|date +%s --date "now\1"|e'
이는 대체된 표현식뿐만 아니라 전체 줄을 평가합니다.
나는 sed를 사용하는 것을 좋아하지 않으므로 다른 제안도 환영하지만 일반 지식을 위해 sed를 작동시키는 방법이 궁금합니다.
답변1
내가 아는 한, GNU sed e
수정자는 항상 전체 패턴 공간을 쉘에 전달합니다. 그리고 쉘은 항상/bin/sh
perl
예를 들어 다음을 사용하면 더 나은 행운을 누릴 수 있습니다 .
$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' |
perl -pe 's/@\((.*?)\)/sprintf "%s", $d = `date +%s --date "now $1"`, chomp $d/ge'
For example echo hi 1491874845 bye "1491957645"
( 와 달리 sed
수정 perl
e
자는 쉘 명령의 출력에서 후행 줄 바꿈을 제거하지 않는 것 같습니다. 따라서 그렇습니다 chomp
).
그러나 이를 사용할 계획이라면 perl
날짜 조작에 사용 가능한 모듈 중 하나를 사용하는 것이 좋습니다.
$ echo 'For example echo hi @(-1 day) bye "@(-1 hour)"' |
perl -MDate::Manip=ParseDateDelta,UnixDate -pe 's/@\((.*?)\)/UnixDate(ParseDateDelta($1), "%s")/ge'
For example echo hi 1491875065 bye "1491957865"