Como posso basear o nome do arquivo em uma variável já existente?

3

Estou usando isso para excluir linhas que não correspondem a um padrão:

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5"

Mas agora preciso fazer isso automaticamente, por isso estou definindo uma variável assim:

$ catTMP=~/mpp/*.xml

E eu quero executar algo assim:

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^__^Here^

Como eu basearia o nome de redirecionamento de qual variável já existe? Se você ainda não entende, quero dizer algo assim:

$ cd ~/mpp/
$ ls
x.xml 

$ egrep "pattern1|pattern2|pattern3|pattern4|pattern5" $catTMP > $catTMP.2

$ ls
x.xml x.xml.2

Ou melhor ainda seria editar, mas grep não pode fazer isso, então talvez haja uma maneira de fazer isso com outro comando, e apenas faça algo como -i .

    
por DisplayName 02.11.2014 / 00:37

3 respostas

3

Edite no lugar, mantendo apenas as linhas que correspondem ao padrão:

sed -n -r -i "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml

No BSD sed (Mac OSX), tente:

sed -n -E -i '' "/(pattern1|pattern2|pattern3|pattern4|pattern5)/p" ~/mpp/*.xml

Baseando o nome do arquivo em uma variável já existente

for fname in ~/mpp/*.xml
do
    egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "$fname.2"
done

O acima funciona porque um período não é legal em um nome de variável. Conseqüentemente, o shell sabe que, em $fname.2 , o nome da variável é apenas fname . Se isso não for o caso, as chaves são necessárias. Por exemplo:

for fname in ~/mpp/*.xml
do
    egrep "pattern1|pattern2|pattern3|pattern4|pattern5" "$fname" > "${fname}_2"
done

Aqui, as chaves tornam claro para o shell que o nome da variável é fname , não fname_2 .

    
por 02.11.2014 / 00:43
0

usando awk

for x in 'ls ~/map/*.xml';do awk '/(pattern1|pattern2|pattern3|pattern4|pattern5)/{print}' $x > $x.2; done

o for fará um loop em todos os arquivos xml e awk find pattern, se for combinado, ele será armazenado em .xml.2

    
por 02.11.2014 / 06:16
0

Você pode usar grep como:

for f in /dir/*glob*
do  grep -E 'pattern|list' <<INFILE >"$f"
$(cat "$f")
INFILE
done

Ele soltará todas as linhas em branco à direita de cada arquivo em $f , mas minha suposição é de que linhas em branco provavelmente não estavam entre o seu pattern|list de qualquer maneira.

    
por 02.11.2014 / 21:38