Editor de fluxo - Strings
Comando substituto
Operações de substituição de texto como "localizar e substituir" são comuns em qualquer editor de texto. Nesta seção, ilustramos como o SED executa a substituição de texto. A seguir está a sintaxe do comando de substituição.
[address1[,address2]]s/pattern/replacement/[flags]
Aqui, address1 e address2são os endereços inicial e final, respectivamente, que podem ser números de linha ou strings de padrão. Ambos os endereços são parâmetros opcionais. O padrão é o texto que queremos substituir pela string de substituição. Além disso, podemos especificar sinalizadores opcionais com o SED.
No arquivo books.txt, usamos vírgula (,) para separar cada coluna. Vamos usar a barra vertical (|) para separar cada coluna. Para fazer isso, substitua a vírgula (,) pela barra vertical (|).
[jerry]$ sed 's/,/ | /' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
1) A Storm of Swords | George R. R. Martin, 1216
2) The Two Towers | J. R. R. Tolkien, 352
3) The Alchemist | Paulo Coelho, 197
4) The Fellowship of the Ring | J. R. R. Tolkien, 432
5) The Pilgrimage | Paulo Coelho, 288
6) A Game of Thrones | George R. R. Martin, 864
Se você observar com atenção, apenas a primeira vírgula é substituída e a segunda permanece como está. Por quê? Assim que o padrão coincide, o SED o substitui pela string de substituição e passa para a próxima linha. Por padrão, ele substitui apenas a primeira ocorrência. Para substituir todas as ocorrências, use o sinalizador global (g) com SED da seguinte forma:
[jerry]$ sed 's/,/ | /g' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
1) A Storm of Swords | George R. R. Martin | 1216
2) The Two Towers | J. R. R. Tolkien | 352
3) The Alchemist | Paulo Coelho | 197
4) The Fellowship of the Ring | J. R. R. Tolkien | 432
5) The Pilgrimage | Paulo Coelho | 288
6) A Game of Thrones | George R. R. Martin | 864
Agora, todas as ocorrências de vírgulas (,) são substituídas pela barra vertical (|).
Podemos instruir o SED a realizar a substituição de texto apenas quando uma correspondência de padrão for bem-sucedida. O exemplo a seguir substitui a vírgula (,) pela barra vertical (|) apenas quando uma linha contém o padrão The Pilgrimage.
[jerry]$ sed '/The Pilgrimage/ s/,/ | /g' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage | Paulo Coelho | 288
6) A Game of Thrones, George R. R. Martin, 864
Além disso, o SED pode substituir uma ocorrência específica do padrão. Vamos substituir apenas a segunda instância da vírgula (,) pela barra vertical (|).
[jerry]$ sed 's/,/ | /2' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
1) A Storm of Swords, George R. R. Martin | 1216
2) The Two Towers, J. R. R. Tolkien | 352
3) The Alchemist, Paulo Coelho | 197
4) The Fellowship of the Ring, J. R. R. Tolkien | 432
5) The Pilgrimage,Paulo Coelho | 288
6) A Game of Thrones, George R. R. Martin | 864
No exemplo acima, o número no final do comando SED (ou no local da bandeira) implica na 2ª ocorrência.
O SED oferece um recurso interessante. Após realizar a substituição, o SED fornece uma opção para mostrar apenas as linhas alteradas. Para este propósito, o SED usa opbandeira que se refere à impressão. O exemplo a seguir lista apenas as linhas alteradas.
[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, PAULO COELHO, 197
5) The Pilgrimage, PAULO COELHO, 288
Podemos armazenar as linhas alteradas em outro arquivo também. Para alcançar este resultado, use owbandeira. O exemplo a seguir mostra como fazer isso.
[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt
Usamos o mesmo comando SED. Deixe-nos verificar o conteúdo dojunk.txt Arquivo.
[jerry]$ cat junk.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, PAULO COELHO, 197
5) The Pilgrimage, PAULO COELHO, 288
Para realizar uma substituição sem distinção entre maiúsculas e minúsculas, use o sinalizador i que implica ignorar maiúsculas e minúsculas. O exemplo a seguir executa uma substituição que não diferencia maiúsculas de minúsculas.
[jerry]$ sed -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, PAULO COELHO, 197
5) The Pilgrimage, PAULO COELHO, 288
Até agora, usamos apenas o caractere de barra (/) como delimitador, mas também podemos usar a barra vertical (|), arroba (@), circunflexo (^), ponto de exclamação (!) Como delimitador. O exemplo a seguir mostra como usar outros caracteres como delimitador.
Vamos supor que você precise substituir o caminho /bin/sed com /home/jerry/src/sed/sed-4.2.2/sed. Portanto, seu comando SED se parece com este:
[jerry]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/jerry\/src\/sed\/sed-4.2.2\/sed/'
Ao executar o código acima, você obtém o seguinte resultado:
/home/jerry/src/sed/sed-4.2.2/sed
Podemos tornar este comando mais legível e fácil de entender. Vamos usar a barra vertical (|) como delimitador e ver o resultado.
[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'
Ao executar o código acima, você obtém o seguinte resultado:
/home/jerry/src/sed/sed-4.2.2/sed
De fato! Obtivemos o mesmo resultado e a sintaxe é mais legível. Da mesma forma, podemos usar o sinal "arroba" (@) como um delimitador da seguinte maneira:
[jerry]$ echo "/bin/sed" | sed '[email protected]/bin/[email protected]/home/jerry/src/sed/sed-4.2.2/[email protected]'
Ao executar o código acima, você obtém o seguinte resultado:
/home/jerry/src/sed/sed-4.2.2/sed
Além disso, podemos usar o circunflexo (^) como delimitador.
[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'
Ao executar o código acima, você obtém o seguinte resultado:
/home/jerry/src/sed/sed-4.2.2/sed
Também podemos usar um ponto de exclamação (!) Como delimitador da seguinte maneira:
[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'
Ao executar o código acima, você obtém o seguinte resultado:
/home/jerry/src/sed/sed-4.2.2/sed
Geralmente, a barra invertida (/) é usada como um delimitador, mas às vezes é mais conveniente usar outros delimitadores suportados com SED.
Criando uma Substring
Aprendemos o poderoso comando substituto. Vamos ver se podemos encontrar uma substring de um texto correspondente. Vamos entender como fazer isso com a ajuda de um exemplo.
Vamos considerar o seguinte texto:
[jerry]$ echo "Three One Two"
Suponha que tenhamos que organizá-lo em uma sequência. Significa que ele deve imprimir um primeiro, depois dois e, finalmente, três. O seguinte one-liner faz o necessário.
echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'
Observe que no exemplo acima, a barra vertical (|) é usada como um delimitador.
Em SED, substrings podem ser especificados usando um operador de agrupamento e devem ser prefixados com um caractere de escape, ou seja, \( e \).
\wé uma expressão regular que corresponde a qualquer letra, dígito ou sublinhado e "+" é usado para corresponder a mais de um caractere. Em outras palavras, a expressão regular\(\w\+\) corresponde à única palavra da string de entrada.
Na string de entrada, existem três palavras separadas por espaço, portanto, existem threeexpressões regulares separadas por espaço. A primeira expressão regular armazena a primeira palavra, ou seja, Três, a segunda armazena a palavraOne, e o terceiro armazena a palavra Two
Essas substrings são referidas por \N,onde N é o número da substring. Conseqüentemente,\2 imprime a segunda substring, ou seja, One; \3 imprime a terceira substring, ou seja, Two; e \1 imprime a primeira substring, ou seja, Three
Vamos separar essas palavras por vírgulas (,) e modificar a expressão regular de acordo.
[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'
Ao executar o código acima, você obtém o seguinte resultado:
One,Two,Three
Observe que agora há vírgula (,) em vez de espaço na expressão regular.
Sinalizadores de substituição de string (apenas GNU SED)
Na seção anterior, vimos alguns exemplos do comando de substituição. O GNU SED fornece algumas sequências de escape especiais que podem ser usadas na string de substituição. Observe que esses sinalizadores de substituição de string são específicos do GNU e podem não funcionar com outras variantes do SED. Aqui, discutiremos os sinalizadores de substituição de strings.
\ L: Quando \ L é especificado na string de substituição, ele trata todos os caracteres restantes da palavra após \ L como caracteres minúsculos. Por exemplo, os caracteres "ULO" são tratados como caracteres minúsculos.
[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288
\ u: Quando \ u é especificado na string de substituição, ele trata o caractere imediato após \ u como um caractere maiúsculo. No exemplo a seguir, \ u é usado antes dos caracteres 'a' e 'o'. Portanto, o SED trata esses caracteres como letras maiúsculas.
[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, pAulO Coelho, 197
5) The Pilgrimage, pAulO Coelho, 288
\ U: Quando \ U é especificado na string de substituição, ele trata todos os caracteres restantes da palavra após \ U como caracteres maiúsculos.
[jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, PAULO Coelho, 197
5) The Pilgrimage, PAULO Coelho, 288
\ E: este sinalizador deve ser usado com \ L ou \ U. Ele interrompe a conversão iniciada pelo sinalizador \ L ou \ U. No exemplo a seguir, apenas a primeira palavra é substituída por letras maiúsculas.
[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
3) The Alchemist, PAULO coelho, 197
5) The Pilgrimage, PAULO coelho, 288