텍스트 줄의 일부 평가

텍스트 줄의 일부 평가

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

관련 정보