Заменить все слово с помощью BSD sed при замене отдельных букв?

В Debian большинство библиотек устанавливаются по пути, зависящему от архитектуры; предполагая, что вы используете типичный 64-битный ПК (архитектура amd64 в Debian), вы найдете libQtCore.so и его друзей в / usr / lib / x86_64 -linux-gnu .

Чтобы выяснить это в общих чертах, вы можете использовать dpkg-architecture -qDEB_HOST_MULTIARCH (из пакета dpkg-dev ). Когда вы ищете файлы, обратите внимание на apt-file : он может искать файлы во всех доступных пакетах в Debian, а apt-file search libQtCore находит libqtcore4 и libqt4-dev в секундах.

1
02.12.2015, 02:06
3 ответа

Возможно, использовать y // (встроенная команда tr в sed) вместо s /// :

$ echo clayii | sed -e '/clayii/ y/clayk/kieio/'
kieiii

Обратите внимание, что команда y // будет по-прежнему применяться ко всей строке, а не только к подходящее слово.

2
29.04.2021, 00:20

можно зациклить над ним:

echo  here is a pat and a tern and a pattern     |
sed  -e'1{H;x;s/\(.\).*/\1pattern\1replace/;x;}' \
-eG  -e'/\(.*\)\(.*\n\)\(\n\1\)\n/!{P;d;}'       \
     -e's//\3\2/;t-'                             \
-e:- -e's/\(\n\)\(.\)\(.*\n\)\(.\)/\4\1\3/;t-'   \
     -e's/\n//;P;d'

here is a pat and a tern and a replace

Это заменяет char на char, идущую слева направо. При каждой замене первый разделитель сдвигается вправо от заменяемого символа. Вы можете понять, что я имею в виду, если вставите команду l ook непосредственно перед циклом t ested подстановка после -e: - :


here is a pat and a tern and a \npattern\nreplace$
here is a pat and a tern and a r\nattern\neplace$
here is a pat and a tern and a re\nttern\nplace$
here is a pat and a tern and a rep\ntern\nlace$
here is a pat and a tern and a repl\nern\nace$
here is a pat and a tern and a repla\nrn\nce$
here is a pat and a tern and a replac\nn\ne$
here is a pat and a tern and a replace\n\n$
here is a pat and a tern and a replace

Если вы действительно ищете что-то вроде перевода, вы тоже можете это сделать. Я написал это ранее как ответ на другой вопрос:

Это выглядит выполнимым - вам просто нужно как бы сдвигать / сдвигать:

 echo can ccccc ccccccccclayii sed глина игнорировать \ 
каждый cclayii вещь, кроме совпадающего слова \ 
 - cclayiicclayii | 
sed -e'y / / \ n / '\ 
 - eh -e's / \ (cclayii \) \ 1 * / & / g; x; s // / g; s / ^ / / '\ 
 - ex -e's //./; s / \ ([^] * * \) \ {2 \} / \ 1 / g; s / ^ / / '\ 
 -e'y / Clayk / kieio /; G; t $' -e: $ \ 
 -e '/ ^ \ n / {s ///; y / \ n / \ n /;} '\ 
 - et -e's / ^ * \ ([^] * \) \ (.* \ n [^] * \) / \ 2 \ 1 /; t $ '
 

 может ccccc ccccccckieiii sed глина игнорировать все kkieiii, кроме совпадающего слова - kkieiiikkieiii 
 

... это непросто.

Этот тоже немного зацикливается, но не так сильно.

Однако, как и в случае с наиболее сложными задачами, на способ проще использовать два sed s:

 echo can ccccc ccccccccclayii sed Clay ignore \ {{1 }} все cclayii, кроме совпадающего слова \ 
 - cclayiicclayii | 
sed -e's / \ (cclayii \) \ 1 * / \ n & \ n / g; G; s / ^ / / '| 
sed -e' / ^ /!y/clayk/kieio/;/./{H;d;} '\ 
 -e'x; s / \ n \ {0 , 1 \} // g '
 

 может ccccc ccccccckkieiii sed глина игнорировать все kkieiii, кроме совпадающего слова - kkieiiikkieiii 
 

С BSD sed вы я захочу использовать буквальную новую строку вместо n в экранировании \ n в правой замене первого sed там.

0
29.04.2021, 00:20

В BSD sed вы можете использовать:

sed "s/[[:<:]]clayii[[:>:]]/kieii/g" /path/to/file
0
29.04.2021, 00:20

Теги

Похожие вопросы