Как использовать sed для удаления ./ между двумя символами в Unix оболочке - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь удалить ./ между двумя символами, используя sed, но не получаю желаемого результата.

Пример:

e2b66a3d84ee448c33d7f2a2f7e51c58  ./2017_06_10_0400.txt

Я пробовал ниже, но это не так работает, как ожидалось, даже . в ".txt" удаляется.

sed -i 's/[./,]//g'

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Осторожно: даже не думайте об использовании опции -i, пока не узнаете, что код работает. Вы можете все испортить!

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

sed -e 's%[.]/%%g'

Вы можете выбрать разделитель в команде s///, и когда регулярные выражения включают /, это разумно чтобы выбрать что-то другое - я часто использую %, когда это не фигурирует в тексте. -e является необязательным. Использование [.] для обнаружения действительной точки является одним из способов; Вы можете написать \., если хотите, но я аллергик c на обратную косую черту, которую можно избежать (если вам никогда не приходилось писать 16 обратной косой черты подряд, чтобы troff сделал то, что вы хотите, у вас нет пострадал достаточно).

Имейте в виду, что опция -i ведет себя по-разному в GNU sed и BSD (macOS) sed. Использование -i.bak работает в обоих случаях (для произвольной непустой строки, такой как .bak). В противном случае ваш код не переносим (что может иметь или не иметь значения для вас сейчас, но вполне может иметь значение позже).

У вас есть:

sed -i 's/[./,]//g'

Проблема в том, что что он ищет любой из символов ., / или , изолированно - поэтому он удаляет . в .txt, а также . и / в ./. Вам нужно искать последовательные символы - как в моем предложенном решении.

1 голос
/ 18 марта 2020

попробуйте это:

echo "e2b66a3d84ee448c33d7f2a2f7e51c58  ./2017_06_10_0400.txt" | sed -e 's|\./||'
0 голосов
/ 18 марта 2020

Вам необходимо использовать escape-символ \

's#\.\/##g' 
:=>echo "e2b66a3d84ee448c33d7f2a2f7e51c58  ./2017_06_10_0400.txt"  | sed 's#\.\/##g' 
e2b66a3d84ee448c33d7f2a2f7e51c58  2017_06_10_0400.txt
:=>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...