remove uma parte de uma linha contida em dois tipos diferentes de separadores / delimitadores [duplicados]

1

A maioria das ferramentas de linha de comando que estou vendo tem a capacidade de escolher um delimitador de campo. No entanto, gostaria de escolher um delimitador para iniciar e outro diferente para finalizar o segmento de texto que gostaria de remover de cada linha que estou processando.

1text [blah blah blah] text number punctuation text text
2text text text
3text text (text) [blah blah blah] number text
4text <url> <email> text [blah blah blah] text

Gostaria de remover todo o 'blá blá blá' dessas linhas.

Blah pode conter qualquer coisa, exceto novas linhas, EOFs e outras coisas novas, e '['. ie: eu não deveria ter '[[' (nem '[blah [') em nenhum dos dados

Eu só tenho uma instância (opcional) de [] por linha. Então, para a linha 2 não há nada para remover, e isso não deve causar parada, parada ou falha.

Tenho quase 100% de certeza de que, se tiver um começo '[' também tenho um ']'. Isso pode ser bom para verificar, no entanto.

Existem outras formas de pontuação, por isso não quero trabalhar com algo que apenas procura coisas não alfanuméricas para começar a remover (isto é: linha 4)

Pontos de bônus para poder descobrir se estou juntando dois espaços em branco (agora adjacentes) naquele ponto em particular - mas sem remover os dois espaços em branco em qualquer outro ponto.

Tenho certeza que terei que usar o awk ou o sed, mas se houvesse uma maneira de fazer isso por meio de ferramentas de linha de comando regulares, para torná-lo o mais portátil possível, seria ideal.

Além disso, explicar o que você está fazendo (se você estiver usando regex / sed) certamente ajudaria, como:

Uma sugestão aqui diz:

sed 's/^.*%\([^ ]*\) .*\$\([^$]*\)$/ /' infile

Eu tenho esse tipo de trabalho com este pouco de monkeying:

cat data | sed 's/^.*\[\([^ ]*\) .*\]\([^$]*\)$/ /'

No entanto, não elimina toda a faixa de 'blá blá blá' e sai com uma quebra de linha extra.

Usando o cut / awk / sed com dois delimitadores diferentes

Realmente não responde a pergunta em um sentido geral (ou, pelo menos eu não consegui descobrir algo depois de lê-la - talvez apenas uma falha na minha parte), mas parece ser (também) especificamente adaptado aos dados dessa pessoa.

    
por user3082 14.01.2015 / 18:05

1 resposta

2

Isso é muito simples. Você não precisa de delimitadores como tal, uma simples expressão regular serve. Basta procurar por uma abertura [ , seguida por quantos caracteres não- ] ou [ forem possíveis até o final da linha. Por exemplo:

  1. Perl

    Se você sabe que não há [[ ou outras coisas estranhas:

    perl -pe 's/\[.+?\]//g' file
    

    Se você pode ter coisas estranhas:

    perl -pe 's/\[[^\[\]]*\]//g' file
    
  2. sed

    sed  's/\[[^]]*\]//g' file
    
por 14.01.2015 / 18:18

Tags