Variável de busca e remoção Unix (contém barra) de um arquivo

2

Eu tenho um requisito para procurar por uma variável "nt" (contém uma barra). De um arquivo text1 e remova todas as linhas que o contenham

$ echo $nt
/u01/app/us1fa01_0/

$ cat text1
/u01/app/fa01/
/u01/app/us1fa01_0/
/u01/app/us1fa01_ps6/

Saída esperada -

$ cat text1
/u01/app/fa01/
/u01/app/us1fa01_ps6/

Eu tentei os seguintes comandos:

  1. sed "/$nt/d" text1

    sed: -e expression #1, char 3: unknown command: 'u'
    
  2. sed "|$nt|d" text1

    sed: -e expression #1, char 1: unknown command: '|'
    
  3. sed '\|"$nt"|d' text1

    /u01/app/fa01/
    /u01/app/us1fa01_0/
    /u01/app/us1fa01_ps6/
    

Nenhum dos códigos acima parece funcionar. Procurando uma saída

    
por neha dhawan 31.08.2017 / 14:18

3 respostas

2

Com grep :

grep -Fv -f <(echo "$nt") text1
  • -F - interprete o padrão como uma lista de sequências fixas

  • -v - inverte o sentido de correspondência para selecionar linhas não correspondentes

  • -f - obtém padrões do arquivo, um por linha

A saída:

/u01/app/fa01/
/u01/app/us1fa01_ps6/
    
por 31.08.2017 / 14:30
0

Com o GNU sed (não tenho certeza sobre outras implementações de sed), você pode usar \%pattern% , onde % é um caractere arbitrário.

Então, o seguinte deve funcionar:

sed "\%$nt%d" text1
    
por 31.08.2017 / 14:40
0
$ sed "\#$nt#d" text1 
/u01/app/fa01/
/u01/app/us1fa01_ps6/

sed permite que você use um delimitador de padrão arbitrário se você citá-lo com \ .

Isso falhará se $nt contiver% caracteres # . Neste caso, use outro delimitador.

Observe que isso excluirá a linha que contém o padrão em qualquer lugar da linha.

Para forçar o padrão a corresponder em toda a linha, use

$ sed "\#^$nt\$#d" text1

Aqui, precisamos citar a âncora de final de linha $ do shell com \$ .

    
por 31.08.2017 / 14:37

Tags