Removendo caracteres entre | tubos |

2

Eu tenho vários arquivos de texto que preciso modificar

test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|...

Estou tentando automatizar o processo de remoção de "test5232.lop", incluindo o procedimento do pipe, assim:

test.xyz|test3.abc|filename.test|file.text|qwerty.bat|...

Sem a necessidade de gerar um arquivo temporário, se possível

    
por John Doe6262 01.04.2017 / 02:44

5 respostas

9

Isso parece um trabalho para cut . Diga-lhe que o delimitador é | , que queremos especificar os campos a serem soltos, não os campos a serem mantidos ( --complement ) e que queremos selecionar o campo 3 (para descartar neste caso).

Código:

 cut -d '|' --complement -f 3

Teste:

$ echo 'test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat|x' | cut -d '|' --complement -f 3
test.xyz|test3.abc|filename.test|file.text|qwerty.bat|x
    
por 01.04.2017 / 02:59
3

Verifique também esta solução simples do awk. Removerá a string não importa onde esteja e deverá ser portátil:

$ a="test.xyz|test3.abc|test5232.lop|filename.test|file.text|qwerty.bat"
$ awk -F"test5232.lop." '{printf("%s%s\n",$1,$2)}' <<<"$a"
test.xyz|test3.abc|filename.test|file.text|qwerty.bat

Sobre sua solicitação de edição no local, versão GNU AWK > 4.1 também pode fazer edições internas de acordo com para analisar o manual:

awk -i inplace -v INPLACE_SUFFIX=.bak '{...}'

Mas, em qualquer caso, nem o awk nem o sed nem o perl podem conseguir uma edição real no local. As Páginas de Informações do GNU sed esclarecem este problema para nós:

'-i[SUFFIX]'
'--in-place[=SUFFIX]'
     This option specifies that files are to be edited in-place.  GNU
     'sed' does this by creating a temporary file and sending output to
     this file rather than to the standard output.(1).

Significa que você pode usar qualquer solução aqui, adicionando no final algo assim:

awk/sed/perl/whatever oldfile >tmpfile && mvtmpfile oldfile && rm -f tmpfile 
    
por 01.04.2017 / 03:31
2

Apenas use Sed:

sed 's/|test5232\.lop//' file.txt

Resposta original, antes de o pedido ser esclarecido:

Somente recursos POSIX, usando Sed :

sed 's/|[^|]*//2' file.txt

Se você sabe que todas as linhas têm pelo menos três símbolos | , você pode usar o formulário mais intuitivo:

sed 's/[^|]*|//3' file.txt
    
por 01.04.2017 / 03:09
2

Para substituir o terceiro campo (onde um "campo" é "qualquer coisa exceto um pipe, zero ou mais vezes, seguido por um pipe") sem nada:

awk '{$0=gensub(/[^|]*\|/, "", 3); print $0}' input

Aparentemente, você deseja remover "test5232.lop" em qualquer lugar da linha:

sed -i 's/|test5232\.lop//' input

(embora qualquer solução, incluindo sed -i , crie um arquivo temporário)

    
por 01.04.2017 / 03:14
2
perl -F'[|]' -pale '$_ = join "|", grep $_ ne "test5232.lop", @F' yourfile

perl -F'[|]' -pale '1 while s/(^|\|)\Ktest5232\.lop(\||$)//g'     yourfile

sed -e '
  :clip
     s/[|]test5232\.lop[|]/|/
   tclip

   s/^test5232\.lop[|]//
   s/[|]test5232\.lop$//
   s/^test5232\.lop$//
' yourfile
    
por 01.04.2017 / 09:13