Como procurar e substituir uma string por novas linhas na linha de comando em um arquivo

1

Eu quero substituir todas as ocorrências de uma string de texto em um arquivo de texto na linha de comando do CentOS 7.2.

Search-string: ).\nPORT
Replacement-string: ). \n0 closed ports\nPORT

Eu sei, isso pode ser alcançado com diferentes ferramentas como sed , awk , tr , ... mas não consigo descobrir uma maneira fácil de fazer isso e ser capaz de entender o comando ( importante ;-)). Para mim, o maior problema são as novas linhas, sem elas, é uma chamada muito simples para sed . Mas com novas linhas ...

Qualquer sugestão com explicação é muito bem-vinda.

editado

Entrada

...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency). 
PORT   STATE SERVICE
21/tcp open  ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...

Saída

...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency). 
0 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...
    
por Christian Waidner 12.07.2016 / 13:02

2 respostas

2

Aqui está um caminho possível

sed '/)\. $/ {
n                          
/^PORT/ i\
0 closed ports
}'

Teste

$ sed '/)\. $/ {
n                          
/^PORT/ i\
0 closed ports
}' < input
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00090s latency). 
0 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
...
Nmap scan report for w.x.y.z (x.x.x.x)
Host is up (0.00079s latency).
Not shown: 2 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
|_banner: SSH-2.0-mpSSH_0.2.1
...
    
por 12.07.2016 / 14:42
0

Você pode usar N in sed para puxar a próxima linha de entrada no espaço padrão e, em seguida, trabalhar em duas linhas de uma só vez.

Como exemplo, puxe condicionalmente a próxima linha ao ver um foo e, em seguida, faça uma substituição nas duas linhas. (Observe que linhas consecutivas com foo irão quebrar isso.)

echo -e "asf\nfoo\nbar" | sed -e '/foo/N;s/o\nb/od\nc/'

Além disso, o GNU sed tem a opção -z que separa "linhas" em caracteres NUL em vez de novas linhas. Isso permitirá que você combine facilmente com padrões que cruzam uma nova linha, mas fará com que as operações de string sejam executadas em toda a entrada de uma só vez, o que pode ser um problema com entradas grandes.

A estrutura ao redor deve ser levada em conta, isso pode influenciar a melhor maneira de fazer a edição.

    
por 12.07.2016 / 13:34