Como usar o endereço de conteúdo no sed on osx sem erro “endereço de contexto esperado”

0

Estou recebendo este erro

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

com esta linha:

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

que funciona no meu sistema Ubuntu debian.

O arquivo completo é

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
'

Exemplo de entrada

<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>

Eu também tentei:

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

mas todos eles dão um código de comando inválido

Eu também tentei:

...
sed -E '
/^[[:space:]]*pause$/,+1d
...
    
por Michael Durrant 15.09.2015 / 17:01

1 resposta

4

O Linux geralmente tem o GNU sed, o OS X usa o sed do BSD. O endereço '/ pattern /, + 1' é uma extensão GNU, não funcionará com outras implementações sed.

O que pode funcionar é o seguinte (juntando uma linha com a próxima e depois excluindo a linha):

/pattern$/N; /pattern/d

Pelo menos isso funcionou no OS X 10.10. Observe os diferentes padrões.

Como seu objetivo é manipular um arquivo XML, sed não é a ferramenta certa para começar. Por exemplo, dê uma olhada no Python e seu módulo lxml (não faz parte do lib padrão do Python); essa combinação funcionou bem para mim.

    
por 15.09.2015 / 18:45

Tags