Apagar até determinado caractere a partir da string dada

2
root@server:~/foo$ cat INPUT.txt
limit. Current u'^'ZO
limit. Current usage'^'FR
limit. Current us'^'AS
limit. Current usage 95 %.'^'FR
limit. Cur'^'AEW
root@server:~/foo$ sed "s/limit.SOMEMAGIC/limit./g" INPUT.txt
limit.'^'ZO
limit.'^'FR
limit.'^'AS
limit.'^'FR
limit.'^'AEW

Pergunta: como podemos excluir as strings ("Cur ......") depois de "limit". até o: " ' " ? Procurando por "SOMEMAGIC":)

    
por evachristine 07.08.2014 / 09:23

3 respostas

0

Na entrada específica que você mostra, você pode simplesmente fazer

perl -pe "s/ Cur[^']*//" INPUT.txt 

ou, em sed

sed "s/ Cur[^']*//" INPUT.txt 

Isso simplesmente excluirá um espaço seguido por Cur e por quantos caracteres não ' forem possíveis. Se você precisar fazer isso somente se a palavra anterior for limit. , use uma das outras respostas ou:

awk "\~/limit\./{sub(/Cur[^']*/,\"\",\)}1;" INPUT.txt

Há algumas acrobacias de citações acontecendo porque precisamos colocar o scriptlet awk em " , porque precisamos do [^'] , então o shell expandirá $1 e $2 antes de serem passados para o awk, a menos que escape-os como \ e \ .

    
por 07.08.2014 / 13:34
4

Você pode usar:

sed -e "s/^\(limit\.\)[^']*//" < data

Corresponde a limit. no início de uma linha, seguido pelo maior número possível de caracteres que não são ' e o substitui apenas pela parte no início ( ). Você pode editar o padrão e a substituição de acordo com a forma como seus dados realmente estão - a parte importante é [^']* .

    
por 07.08.2014 / 09:29
2

Com perl (versão > 5.10.0):

$ perl -pe "s/^limit\.\K(.*?)\'/\'/" file
limit.'^'ZO
limit.'^'FR
limit.'^'AS
limit.'^'FR
limit.'^'AEW

De perldoc perlrebackslash :

\K  This appeared in perl 5.10.0. Anything matched left of "\K" is not
    included in $&, and will not be replaced if the pattern is used in a
    substitution. This lets you write "s/PAT1 \K PAT2/REPL/x" instead of
    "s/(PAT1) PAT2/${1}REPL/x" or "s/(?<=PAT1) PAT2/REPL/x".

    Mnemonic: Keep.
    
por 07.08.2014 / 10:09