@(<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"