Isso basicamente se resume a "Como eu combino pwd e sed delete (ou alternativa)". Dado um arquivo com uma lista de caminhos de arquivo, como eu excluo linhas que contêm meu diretório atual?
Então, se file1 contém:
/dirA/subdir1/somefile
/dirB/subdir2/somefile
/dirB/subdir2/somefile
/dirC/subdir2/somefile
/dirD/subdir1/somefile
E meu diretório de trabalho é:
/dirB/subdir2/
Então minha saída deve editar file1 no lugar para resultar em:
/dirA/subdir1/somefile
/dirC/subdir2/somefile
/dirD/subdir1/somefile
Eu sei que posso apagar linhas com:
sed '/pattern to match/d' file1
E eu posso alimentar o pwd no sed assim:
sed 's?#REPLACE-WITH-PATH?'`pwd`'?'
Então pensei que poderia combiná-los como um dos seguintes:
sed '/'`pwd`'/d' file1
sed '?'`pwd`'?d' file1
sed '#'`pwd`'#d' file1
A primeira opção não será lida corretamente, porque interpreta as barras do caminho como parte do comando sed. A segunda não reconhece o ponto de interrogação. A terceira roda, mas não faz nada.
Como seu diretório atual contém,
/
sugiro alternar de/.../d
para\|...|d
ou\#...#d
.A variável
$PWD
é preenchida com o diretório de trabalho atual, então adicione uma barra a ela e useawk
.Use uma das seguintes linhas do Perl, dependendo se você deseja pular ou imprimir as linhas que contêm um subdiretório do diretório de trabalho atual, por exemplo
/dirB/subdir2/subdir3/somefile
:Pular
/dirB/subdir2/subdir3/somefile
:Imprimir
/dirB/subdir2/subdir3/somefile
:O Perl one-liner usa estes sinalizadores de linha de comando:
-e
: Diz ao Perl para procurar código em linha, em vez de em um arquivo.-n
: Faz um loop na entrada, uma linha de cada vez, atribuindo-a$_
por padrão.-l
: Remove o separador de linha de entrada ("\n"
por padrão no *NIX) antes de executar o código em linha e acrescenta-o ao imprimir.O regex usa estes modificadores:
x
: Ignora espaços em branco e comentários, para facilitar a leitura.No regex:
^
: Corresponde ao início da linha.\Q$ENV{PWD}\E
: Diretório de trabalho atual ($ENV{PWD}
), com metacaracteres de padrão desabilitados (entre aspas). Obrigado a jhnc pela sugestão de usar\Q
..+
: Qualquer caractere repetido 1 ou mais vezes.[^/]+
: Qualquer caractere, exceto uma barra (/
), repetido 1 ou mais vezes.$
: Corresponde ao final da linha.Veja também:
perldoc perlrun
: como executar o interpretador Perl: opções de linha de comandoperldoc perlre
: Expressões regulares Perl (regexes)perldoc perlrequick
: Início rápido de expressões regulares Perl