No linux como eu faço para 'citar' back-tic através do shell em sed.

3

No linux, como faço para obter o código ascii decimal / hex / oct de um caractere ascii ou ascii a partir de um código decimal / hex / oct.

Eu vejo no manual do usuário do gnu sed que eu posso usar o \ d # \ o # \ x # para especificar um personagem, mas não tenho certeza de como usá-lo.

Se alguém tiver uma maneira melhor de obter os recursos 'and' chars por favor ajude

Eu quero sed com o caractere backtick '' 'e' '' caractere de aspas simples.

sed '/'/p'

não funcionam

sed '/\'/p'
sed '/'/p'

    
por nelaaro 03.08.2011 / 15:46

4 respostas

6

Não tenho certeza absoluta do que você está tentando fazer com sed . É isso que você está procurando?

printf "\x27 \x60\n"
# prints
# ' '

printf "%x %x\n" "''" "'\'"
# prints
# 27 60

Extraído de BashFAQ 071

Editar

sed está perfeitamente bem com ' ou ' em seu regex. Onde você está encontrando problemas é obter esses caracteres através do interpretador de shell, já que tanto aspas simples quanto backtick têm um significado especial para o shell, e devem ser citadas se forem feitas para sed sem bash jogando um erro de sintaxe ou desconfigurando a entrada.

Existem três formas de citar caracteres especiais: aspas simples ' , aspas duplas " e aspas invertidas \ . Todos eles se comportam de maneira um pouco diferente. ' cita tudo, exceto ele mesmo, portanto, você pode usar isso para citar ' , mas não ' . " cita tudo, exceto \ , ' e $ (irrelevante aqui), então você pode usar " para citar ' , mas não ' . \ cita tudo para que você possa usar isso para ambos. É possível aninhar esses métodos desde que você mantenha as regras de cotação em linha reta (elas são interpretadas da esquerda para a direita).

Para tornar as coisas mais concretas, suponha que você queria s/''/replacement/ em sua sed regex. Existem muitas maneiras de fazer isso. Dois exemplos diferentes são dados abaixo.

# concatenation of single-quoted s/', backslash-quoted ', and 
# single-quoted remainder of the command
sed -e 's/''\''/replacement/'

# one double-quoted string quotes the single-quote, but an 
# additional backslash is needed to quote the backtick 
sed -e "s/\''/replacement/"

Apenas mantenha as regras de cotação em mente e use a versão mais legível para realizar o trabalho. Veja a seção QUOTING no manual bash para uma explicação completa e referência.

Como nota final, eu evitaria usar as saídas especiais \d , \x , \o etc. porque

  • São extensões GNU para sed , que podem ser menos portáteis do que padrões adequadamente citados.
  • É um pouco mais difícil de ler. Quantas pessoas sabem os valores ASCII para ' e ' do topo de suas cabeças?
por 03.08.2011 / 15:55
5

Em um tipo de shell man ascii , isso fornecerá os códigos de caracteres em octal, hexadecimal e decimal.

ASCII(7)             BSD Miscellaneous Information Manual             ASCII(7)

NAME
     ascii -- octal, hexadecimal and decimal ASCII character sets

DESCRIPTION
     The octal set:

     000 nul  001 soh  002 stx  003 etx  004 eot  005 enq  006 ack  007 bel
     010 bs   011 ht   012 nl   013 vt   014 np   015 cr   016 so   017 si
     020 dle  021 dc1  022 dc2  023 dc3  024 dc4  025 nak  026 syn  027 etb
     030 can  031 em   032 sub  033 esc  034 fs   035 gs   036 rs   037 us
     040 sp   041  !   042  "   043  #   044  $   045  %   046  &   047  '
     050  (   051  )   052  *   053  +   054  ,   055  -   056  .   057  /
     060  0   061  1   062  2   063  3   064  4   065  5   066  6   067  7
     070  8   071  9   072  :   073  ;   074  <   075  =   076  >   077  ?
     100  @   101  A   102  B   103  C   104  D   105  E   106  F   107  G
     110  H   111  I   112  J   113  K   114  L   115  M   116  N   117  O
     120  P   121  Q   122  R   123  S   124  T   125  U   126  V   127  W
     130  X   131  Y   132  Z   133  [   134  \   135  ]   136  ^   137  _
     140  '   141  a   142  b   143  c   144  d   145  e   146  f   147  g
     150  h   151  i   152  j   153  k   154  l   155  m   156  n   157  o
     160  p   161  q   162  r   163  s   164  t   165  u   166  v   167  w
     170  x   171  y   172  z   173  {   174  |   175  }   176  ~   177 del

     The hexadecimal set:

     00 nul   01 soh   02 stx   03 etx   04 eot   05 enq   06 ack   07 bel
     08 bs    09 ht    0a nl    0b vt    0c np    0d cr    0e so    0f si
     10 dle   11 dc1   12 dc2   13 dc3   14 dc4   15 nak   16 syn   17 etb
     18 can   19 em    1a sub   1b esc   1c fs    1d gs    1e rs    1f us
     20 sp    21  !    22  "    23  #    24  $    25  %    26  &    27  '
     28  (    29  )    2a  *    2b  +    2c  ,    2d  -    2e  .    2f  /
     30  0    31  1    32  2    33  3    34  4    35  5    36  6    37  7
     38  8    39  9    3a  :    3b  ;    3c  <    3d  =    3e  >    3f  ?
     40  @    41  A    42  B    43  C    44  D    45  E    46  F    47  G
     48  H    49  I    4a  J    4b  K    4c  L    4d  M    4e  N    4f  O
     50  P    51  Q    52  R    53  S    54  T    55  U    56  V    57  W
     58  X    59  Y    5a  Z    5b  [    5c  \    5d  ]    5e  ^    5f  _
     60  '    61  a    62  b    63  c    64  d    65  e    66  f    67  g
     68  h    69  i    6a  j    6b  k    6c  l    6d  m    6e  n    6f  o
     70  p    71  q    72  r    73  s    74  t    75  u    76  v    77  w
     78  x    79  y    7a  z    7b  {    7c  |    7d  }    7e  ~    7f del

     The decimal set:

       0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel
       8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si
      16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb
      24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us
      32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '
      40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /
      48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7
      56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?
      64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G
      72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O
      80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
      88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
      96  '    97  a    98  b    99  c   100  d   101  e   102  f   103  g
     104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o
     112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w
     120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del

FILES
     /usr/share/misc/ascii

HISTORY
     An ascii manual page appeared in Version 7 AT&T UNIX.

BSD                              June 5, 1993                              BSD
    
por 03.08.2011 / 15:59
2

Eu encontrei isso em outro fórum:

perl -ne 'if(/'\''(.*)'\''/) {print $1}'

É um pouco longo e usa Perl, mas funciona:).

Uso:

echo "'string with single quotation marks'" | perl -ne 'if(/'\''(.*)'\''/) {print $1}'
    
por 05.11.2012 / 14:38
0

Uma maneira de fazer isso é usar [] para colocar os caracteres que você deseja pesquisar

isso funciona, embora eu ainda tivesse problemas com o bash pegando o 'tilde char'.

sed -n '/[']/p'

['] quote não funciona como nunca e é pego por bash na expansão da linha de comando.

$ sed -n '/[']/p' ./final/kh_elec_main.db.fin.dump  
> ^C

Como isso funciona? Agora eu posso substituir '= ascii 96 com' = ascii 39

$ printf "%d %d\n" "''" "''"
39 96
sed -ne 's/\d96/\d39/gp'

    
por 03.08.2011 / 15:58