bash + como deletar as strings definidas em var2 de var2

0

Eu uso no meu script bash as seguintes variáveis - val1, val2

val1 representou todos os discos que deveriam estar no SO Linux

val2 representou os discos atuais no OS Linux

minha meta é excluir os discos "$ val2" da variável "$ val1"

val1="sdb sdc sdd sde sdf sdg sdh sdi sdj sdk"
val2="sdb sdc sdf sdd sde sdg"

resultados esperados:

val3=sdh sdi sdj sdk

e defina os resultados como abaixo em val3

    
por yael 29.12.2017 / 10:44

4 respostas

2

Com a substituição de sed :

val3=$(sed -E 's/\<('"$(tr ' ' '|' <<<"$val2")"')\> *//g' <<<"$val1")
echo "$val3"
sdh sdi sdj sdk
  • $(tr ' ' '|' <<<"$val2") - imitando o grupo de alternância regex, isso resultará em sdb|sdc|sdf|sdd|sde|sdg . A construção completa deve aparecer como \<(sdb|sdc|sdf|sdd|sde|sdg)\>
  • \< e \> - são limites de palavras
por 29.12.2017 / 11:04
0

Um caminho:

$ val1="sdb sdc sdd sde sdf sdg sdh sdi sdj sdk"
$ val2="sdb sdc sdf sdd sde sdg"
$ comm -23 <(echo "$val1" | sed "s/ /\n/g" | sort) <(echo "$val2" | sed "s/ /\n/g"| sort) | paste -sd" "
sdh sdi sdj sdk
$

echo "$val1" | sed "s/ /\n/g" | sort : alise a lista de variáveis e classifique comm -23 : Obtenha o conteúdo exclusivo do val1 simplificado
paste -sd" " : concatene o resultado usando o espaço

    
por 29.12.2017 / 10:56
0

comando

echo $val1| tr " " "\n" > val1.txt; echo $val2| tr " " "\n"  > val2.txt; val3='awk 'NR==FNR {a[$1];next}!($1 in a) {print $1}' val2.txt val1.txt' ;echo $val3

saída

 echo $val3
sdh sdi sdj sdk
por 29.12.2017 / 16:53
0

Com grep e substituição de processo :

#!/bin/bash

val1='sdb sdc sdd sde sdf sdg sdh sdi sdj sdk'
val2='sdb sdc sdf sdd sde sdg'

val3="$(grep -v -F -f <(printf "%s\n" $val2) <(printf "%s\n" $val1) | xargs)"

echo "$val1"
echo "$val2"
echo "$val3"

As substituições de processo com printf "%s\n" são usadas para fazer as listas em var1 e var2 parecerem arquivos com uma entrada por linha para grep . var2 é o "arquivo" de entrada para a opção -f e var1 é o "arquivo" a ser usado. xargs é usado para converter a saída de grep de várias linhas em uma única string separada por espaço ... um truque preguiçoso, mas útil.

E aqui está a mesma coisa usando matrizes:

#!/bin/bash

val1=(sdb sdc sdd sde sdf sdg sdh sdi sdj sdk)
val2=(sdb sdc sdf sdd sde sdg)

val3=($(grep -vFf <(printf "%s\n" "${val2[@]}") <(printf "%s\n" "${val1[@]}")))

echo "${val1[@]}"
echo "${val2[@]}"
echo "${val3[@]}"
    
por 30.12.2017 / 07:02