Требуется заменить «hello» на «hello world»
Естественно, мы пытаемся составить стандартную конструкцию типа:
sed -i ‘s/\”hello\”\,/”hello world”,/g’ test.php
Однако, на выходе мы получим hello world. Проблема заключается в том, что текст который мы заменяем прекрасно экранируется, а вот который мы вставляем он идет чистым текстом, и все спецсимволы попросту удаляются. Для выхода из этого положения мы используем малоизвестную возможность sed, возможность работы в hex-16.
Таким образом мы убиваем сразу 2 зайцев, мы можем с легкостью конвертировать строку любой сложности в сед, не ожидая проблем с спецсимволами. А так же можем вставлять их в вывод, не опасаясь остановки самого скрипта.
Заменяем текст со спец символами
sed -i ‘s/\x22hello\x22\,/x22hello world/x22,/g’ test.php
Символ в ASCII Соответствие в HEX-16
! \x21
» \x22
# \x23
$ \x24
% \x25
& \x26
' \x27
( \x28
) \x29
* \x2A
+ \x2B
0 \x2C
- \x2D
. \x2E
/ \x2F
0 \x30
1 \x31
2 \x32
3 \x33
4 \x34
5 \x35
6 \x36
7 \x37
8 \x38
'9 \x39 : \x3A ; \x3B < \x3C = \x3D > \x3E ? \x3F @ \x40 A \x41 B \x42 C \x43 D \x44 E \x45 F \x46 G \x47 H \x48 I \x49 J \x4A K \x4B L \x4C M \x4D N \x4E O \x4F P \x50 Q \x51 R \x52 S \x53 T \x54 U \x55 V \x56 W \x57 X \x58 Y \x59 Z \x5A [ \x5B \ \x5C ] \x5D ^ \x5E _ \x5F ` \x60 a \x61 b \x62 c \x63 d \x64 e \x65 f \x66 g \x67 h \x68 i \x69 j \x6A k \x6B l \x6C m \x6D n \x6E o \x6F p \x70 q \x71 r \x72 s \x73 t \x74 u \x75 v \x76 w \x77 x \x78 y \x79 z \x7A { \x7B | \x7C } \x7D ~ \x7E DEL \x7F''