3

В Linux, как мне получить десятичный / шестнадцатеричный / шестнадцатеричный код ascii от символа или шестнадцатеричный / шестнадцатеричный код ascii.

Из руководства пользователя gnu sed видно, что я могу использовать \d # \o # \x # для указания символа, но я не уверен, как его использовать.

Если у кого-то есть лучший способ получить символы `и ', пожалуйста, помогите

Я хочу использовать sed с символом обратной кавычки '`' и символом 'одинарной кавычки'.

sed '/`/p'

это не работает

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

4 ответа4

6

Не совсем уверен , что вы пытаетесь сделать с sed там. Это то, что вы ищите?

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

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

Взято с BASFAQ 071

редактировать

sed отлично подходит для ` или ' в его регулярном выражении. Проблемы, с которыми вы сталкиваетесь, - это получение этих символов через интерпретатор оболочки, так как одинарные кавычки и обратные символы имеют особое значение для оболочки и должны заключаться в кавычки, если они должны заставить его работать без ошибок, не вызывая синтаксическую ошибку или искажение ввода.

Есть три способа заключить в кавычки специальные символы: одинарная кавычка ' , двойная кавычка " и обратная косая черта \ . Все они ведут себя немного по-разному. ' цитирует все, кроме себя, так что вы можете использовать это, чтобы цитировать ` но не ' . " цитирует все, кроме \ , ` и $ (здесь не имеет значения), поэтому вы можете использовать " для цитирования ' но не ` . \ цитирует все, чтобы вы могли использовать это для обоих. Эти методы можно вкладывать до тех пор, пока вы сохраняете правила цитирования прямыми (они интерпретируются слева направо).

Чтобы сделать вещи более конкретными, предположим, что вы хотели s/`'/replacement/ в вашем регулярном выражении sed . Есть много способов сделать это. Два разных примера приведены ниже.

# 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/"

Просто помните правила цитирования и используйте наиболее читаемую версию, которая выполняет свою работу. Обратитесь к QUOTING « Цитаты » в руководстве по bash для получения полного объяснения и ссылки.

В заключение, я бы не использовал специальные экранированные символы \d , \x , \o и т.д., Потому что

  • Они являются расширениями GNU для sed которые могут быть менее переносимыми, чем правильно цитируемые шаблоны.
  • Это немного сложнее читать. Сколько людей знают значения ASCII для ' и ` вне головы?
5

В оболочке типа man ascii это даст вам коды символов в восьмеричном, шестнадцатеричном и десятичном виде.

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
2

Я нашел это на другом форуме:

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

Это немного долго и использует Perl, но это работает :).

Использование:

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

Один из способов сделать это - использовать [] для включения символов, которые вы хотите найти

это работает, хотя у меня все еще были проблемы с bash, ловящим символ тильды.

sed -n '/[`]/p'

['] цитата не работает, как всегда, и перехватывается bash при расширении командной строки.

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

Это как всегда работает. Теперь я могу заменить `= ascii 96 на '= ascii 39

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .