Вставляем спецсимволы

Требуется заменить «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''

https://klondike-studio.ru/blog/sed-spetssimvoly/