"예상 컨텍스트 주소" 오류 없이 osx의 sed에서 콘텐츠 주소를 사용하는 방법

"예상 컨텍스트 주소" 오류 없이 osx의 sed에서 콘텐츠 주소를 사용하는 방법

이 오류가 발생합니다.

sed: 2: "
/^[[:space:]]*pause$/, ...": expected context address

다음 줄을 사용하세요.

/^[[:space:]]*pause$/,+1d

내 Debian Ubuntu 시스템에서 작동합니다.

전체 파일은 다음과 같습니다

file_in=$1
sed -e'
#
# Delete whole lines
/^<?xml/d
/^<[!]DOCTYPE/d
/^<\(.*html\|.*head\|meta\|.*body\)/d
/^<\(.*table\|.*head\|meta\|.*body\)/d
/^[[:space:]]*<[/]*tr.*>$/d
/storeConfirmation/d
#
# Remove pieces of a line
s/<td>//
s%</*td.*>%%
#
# Replacements - chunks
/^<link/ {
  s/<link rel="selenium.base" href/@link/
  s%[[:space:]]*/>%%
}
/^<title/ {
  s/<title>/feature "/
  s%</title>%" do%
}
/^.*>>>>> / {
  s/^.*>>>>>[[:space:]]*/scenario "/
  s/$/ do/
}
s/-->/"/
s/^.*<<<<<.*/end/
s/<[!]--/#/
/^#/ {
  s/^##/#/
  s/"$//
}
#
# Replacements - characters
/\${/ {
  s/\$/@/g
  s/{//g
  s/}//g
}
s/^[[:space:]]*//
/^[[:space:]]*$/d' $file_in |
sed -e'
/^[[:space:]]*pause$/,+1d
/deleteAllVisibleCookies/d
/click\|wait\|assert/ {
  N;
  s/\n/ /
}
/@.*@/ {
  s/@/+ @/2
}
/select\|type/ {
  N;
  N;
  s/\n/ /g
}
$ a end
'

입력 샘플

<tr>
        <td>waitForVisible</td>
        <td>${css_delete_violation}</td>
        <td></td>
</tr>
<tr>
        <td>click</td>
        <td>${css_delete_violation}</td>
        <td></td>
</tr>
<tr>
        <td>storeConfirmation</td>
        <td></td>
        <td></td>
</tr>
<tr>
        <td>pause</td>
        <td>2000</td>
        <td></td>
</tr>

나는 또한 다음을 시도했습니다.

/^[[:space:]]*pause$/0,+1d
/^[[:space:]]*pause$/1,+1d
/^[[:space:]]*pause$/+1d
/^[[:space:]]*pause$/1d
/^[[:space:]]*pause$/1,2d

하지만 모두 잘못된 명령 코드를 제공합니다.

나는 또한 다음을 시도했습니다.

...
sed -E '
/^[[:space:]]*pause$/,+1d
...

답변1

Linux에는 일반적으로 GNU sed가 있고 OS X에는 BSD의 sed가 사용됩니다. '/pattern/,+1' 주소는 GNU 확장이며 다른 sed 구현과 함께 사용할 수 없습니다.

작동할 수 있는 방법은 다음과 같습니다(한 행을 다음 행과 연결한 후 해당 행 삭제).

/pattern$/N; /pattern/d

적어도 OS X 10.10에서는 작동합니다. 다양한 패턴을 확인하세요.

목표는 XML 파일을 조작하는 것이므로 sed는 적절한 도구가 아닙니다. 예를 들어, Python과 해당 lxml 모듈(Python 표준 라이브러리의 일부가 아님)을 살펴보세요. 이 조합은 나에게 적합합니다.

관련 정보