multiple delimiters awk quando um dos delimitadores é 4 sublinhados (não um)

0
PWD=sgy_comp.20170328_090951.20170328_090730.d_0327____20170325_002526.seiscat

Eu preciso delimitar esses dois . e ____

Se eu tentar e usar (isso não funciona) a sintaxe normal de [.____] , então ele trata os delimitadores ____ as 4 (pois trata ____ da mesma forma que _ )

Exemplo:

basename $PWD
sgy_comp.20170328_090951.20170328_090730.d_0327____20170325_002526.seiscat

basename $PWD|awk -F[."____"] '{print $4}'
090951

Estou tentando obter um retorno de d_0327 . Eu entendo porque não está funcionando da maneira que eu gostaria, apenas procurando a sintaxe certa para fazê-la funcionar.

    
por ced 28.03.2017 / 17:02

1 resposta

4

[<set>] corresponde a um caractere (estendido para elemento de agrupamento com algumas ferramentas e em algumas circunstâncias) do <set> fornecido.

[.____] corresponde especificamente a um caracteres, desde que seja . ou _ ou _ ou _ ou _ . Escusado será dizer que [.____] é o mesmo que [._] .

Se você quiser corresponder a uma das duas strings, precisará do operador de alternância | :

awk -F '\.|____' '{print $4}'

Com o moderno (e padrão) awk s, você também pode escrevê-lo:

awk -F '\.|_{4}' '{print $4}'

Observe também que [...] precisa de cotações para o shell, pois [...] também é um operador de globalização de casca. No seu caso, você citou apenas a parte ____ do shell. Isso não foi necessário, pois _ não é especial para o shell. Isso significa que, com -F[."____"] , se houvesse um arquivo chamado -F. ou -F_ no diretório atual, o shell globbing expandiria -F[."____"] para esses antes de passar para awk . Se não, -F[.____] seria passado para awk (apesar de alguns shells relatarem um erro em vez daquele glob sem correspondência).

    
por 28.03.2017 / 17:27

Tags