Como concatenar duas linhas com 'sed'?

2

Estou tentando concatenar duas linhas de iwlist output. Meus comandos grep e sed para remover espaços iniciais e finais funcionam bem, mas não consigo obter a última instrução sed para remover o \n do trabalho. O que estou perdendo?

sudo iwlist wlan0 scanning |
   grep -e ESSID -e Signal |
   sed -e 's/^[ \t]*//;s/[ \t]*$//' |
   sed -e 's/dBm\n/dBm /'

O regex funciona bem em vim .

    
por sceddy 16.06.2018 / 00:45

1 resposta

2

sed é uma ferramenta de texto. Por padrão, ele gera uma linha de saída por linha de entrada. Embora seja fácil injetar novas linhas na saída (tornando mais linhas), não é tão fácil se livrar das novas linhas da entrada porque elas não pertencem às linhas que estão sendo processadas, elas as separam.

Trecho de info sed (ênfase minha):

sed operates by performing the following cycle on each lines of input: first, sed reads one line from the input stream, removes any trailing newline, and places it in the pattern space. Then commands are executed; […].

No entanto, há N :

N
Add a newline to the pattern space, then append the next line of input to the pattern space. If there is no more input then sed exits without processing any more commands.

Isso permite que você processe linhas em pares, isso é o que você precisa. Inclua N no seu último sed assim:

sed -e 'N;s/dBm\n/dBm /'

Observe que isso só funcionará se a entrada inteira consistir logicamente em linhas que você deseja processar par a par, ou seja, essa estrutura lógica é OK:

line 1
paired 1
line 2
paired 2
…

enquanto este não é:

header
line 1
paired 1
line 2
paired 2
…

Nesse caso, sed emparelhará header com line 1 , paired 1 com line 2 etc., contra sua lógica. Outro mau exemplo:

line 1
paired 1
excessive line
line 2
paired 2
…

O excessive line será emparelhado com line 2 . Isso quebrará a lógica de pares consecutivos.

Então você tem que ter cuidado. Por outro lado, se apenas as linhas estão emparelhadas corretamente, você não precisa se preocupar com as novas linhas que você está substituindo, porque você não pode alterar os pares que separam de qualquer maneira. Por esse motivo, incluir dBm em seu padrão agora é completamente desnecessário. Seu último sed também pode ser:

sed -e 'N;s/\n/ /'

Se você precisar de uma lógica mais complexa, consulte esta resposta . Usa sed para concatenar linhas de acordo com seu conteúdo.

    
por 16.06.2018 / 03:10

Tags