Uso da expressão regular compatível com P
erl em grep
:
grep -Po '..(?==Y)' <file
Resultado:
p2
p6
Eu estava procurando por um comando que irá imprimir a parte selecionada de uma linha que corresponda às condições. Por exemplo, minha linha de texto é assim:
p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X
Eu quero imprimir os valores que têm Y
. Com este exemplo, o resultado esperado é p2,p6
.
Uso da expressão regular compatível com P
erl em grep
:
grep -Po '..(?==Y)' <file
Resultado:
p2
p6
Tente isto:
echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g'
Saída:
p2,p6
awk
pode ler registros com base em um delimitador regex de sua escolha. Por exemplo, '[|\n]'
Ele também pode dividir registros em campos no delimitador de sua escolha. por exemplo. '='
O operador ternário (condition)?:
impede uma vírgula principal.
awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }'
saída:
p2,p6
Se uma nova linha for necessária, ela poderá ser anexada na seção END{}
. Para evitar que uma nova linha seja emitida quando não há correspondências, o Separador do Registro de Saída ( ORS
) pode ser inicialmente definido como nenhum e, em seguida, definido como \n
se uma correspondência for encontrada.
awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}'
Que tal:
tr '|' '\n' | sed -n 's/=Y$//p'
um simples awk
awk -F\| '{for (i=1 ; i<= NF; i++)
if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}'
onde
-F\|
use |
como separador {for (i=1 ; i<= NF; i++)
varre o padrão if ( $i ~/Y/ )
se encontrado { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}
dividi-lo e imprimi-lo saída
in 3 : p2
in 11 : p6
use printf "%s\n",A[1]
para pular o número do padrão
perl -nE 'say join(",",/(\w+)=Y/g)'