Duas operações com sed no mesmo padrão

1

Eu uso o seguinte comando sed para exibir nomes de arquivos com um formulário específico:

ls -1 *|sed 's/^\(.*\).png/\/,/g'

Se eu tiver dois arquivos chamados BOH_Contour.png e BOV_Web.png , obtenho

BOH_Contour/BOH_Contour,
BOV_Web/BOV_Web,

Agora quero remover todos os _ na segunda parte deste resultado e obter

BOH_Contour/BOHContour,
BOV_Web/BOVWeb,

Como posso fazer isso?

    
por Guuk 20.01.2015 / 14:16

4 respostas

3

Normalmente é onde você usa o espaço espera :

ls | sed '
  /\.png$/!d; # discard everything but lines ending in .png
  s///;       # remove that .png
  h;          # store on the hold space
  s/_//g;     # remove underscores
  H;          # append (with a newline) to the hold space
  g;          # retrieve that hold space
  s|\n|/|;    # substitute the newline with a /
  s/$/,/;     # add that extra comma.'
    
por 20.01.2015 / 14:41
0

Basta adicionar outra expressão a sed após ; , por exemplo:

sed 's/^\(.*\).png/\/,/g;s,/\(.*\)_,/,'

Mas tenha em mente que analisar o comando ls não é um bom hábito .

    
por 20.01.2015 / 14:21
0

Possível ajuda:

ls -1 *|sed 's/^\(.*\).png/\/,/g ; : 1 ; s|_\([^/]*$\)||; t 1'

Ou se apenas 1 _ no nome do arquivo

ls -1 *|sed 's/^\(.*\).png/\/,/g ; s|_||2'
    
por 20.01.2015 / 14:23
0

Se todos os nomes contiverem um sublinhado, basta combinar as duas partes do nome separadamente. Você provavelmente não quer a substituição em qualquer lugar da linha, apenas no final do nome do arquivo, então perca o modificador g .

ls | sed 's/^\(.*\)_\(.*\)\.png$/_\/,/'

A propósito, ls -1 é equivalente a ls quando não usado interativamente. ls * não é equivalente a ls , a principal diferença é que, se o diretório atual contiver subdiretórios, ls listará as entradas no diretório atual, enquanto ls * listará as entradas que não são subdiretórios mais o conteúdo de todos subdiretórios. Dado que isso quase nunca é útil, você presumivelmente quis dizer ls .

Se você quiser remover todos os sublinhados, não importa quantos sejam, enquanto é possível usar sed, é mais claro no awk.

ls | awk 'sub(/\.png$/, "") {$0 = $0 "/" gsub(/_/, "", $0) ","} 1'

Como alternativa, você pode usar um loop de shell.

for x in *; do
  case $x in
    *.png) x=${x%.png}; printf '%s/\n' "$x"; printf '%s,\n' "$x" | tr -d _;;
  esac
done
    
por 21.01.2015 / 01:04