awk e caminhos do windows caractere de escape de barra invertida

0

Aqui encontrei uma boa maneira de extraia o nome da base do caminho com awk :

awk 'BEGIN{ var="Z:1708021541\file name with spaces.123"; n=split(var,a,/\//); print a[n]}'

mas, para barras invertidas, não funciona porque os caracteres parecem ter escapado, por ex. a saída dos visuais acima:

Z:�708021541
            ile name with spaces.123

Agora, há alguma maneira de se locomover no awk? Os caminhos são listados em um arquivo e eu não posso (não quero) para pré-processar todos os arquivos para escapar \ , então eu pergunto se há uma maneira de dizer awk "não escapar"?

    
por leosenko 07.03.2018 / 23:20

1 resposta

1

Supondo que você esteja tentando encontrar a parte do nome do arquivo de um nome de caminho do Windows contendo barras invertidas ...

pathname='Z:1708021541\file name with spaces.123'
filename=$(basename "${pathname//\//}")

printf '%s\n' "$filename"

Isso imprimirá

file name with spaces.123

se executado em bash .

A substituição do parâmetro ${pathname//\//} substitui todas as barras invertidas por barras no valor de $pathname , o que significa que o utilitário basename padrão pode funcionar nele. O utilitário basename não se importa que o caminho comece com Z: (acredita que este é o nome de um diretório).

Alternativamente (mais curto e mais portátil):

pathname='Z:1708021541\file name with spaces.123'
filename=${pathname##*\}

printf '%s\n' "$filename"

Aqui, ${pathname##*\} removerá tudo até a última barra invertida em $pathname . Essa substituição de parâmetro é padrão, enquanto a usada na primeira variação funcionará apenas em determinadas camadas.

Usando awk :

printf '%s\n' "$pathname" | awk '{ sub(".*\\", "", $0); print }'

As quatro barras invertidas são duas barras invertidas que escaparam uma vez por cada, por razões.

Usando sed :

printf '%s\n' "$pathname" | sed 's/.*\//'

As soluções awk e sed funcionam exatamente da mesma maneira. Eles substituem tudo até (e incluindo) a última barra invertida com uma string vazia.

    
por 07.03.2018 / 23:42

Tags