텍스트 줄의 일부 평가

텍스트 줄의 일부 평가

양식에 표현식이 있는데 @(<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"

관련 정보