захват групп в седе - PullRequest
23 голосов
/ 21 июля 2010

У меня есть много строк вида

ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
ko04080 ko:GZMA

, и я бы очень хотел избавиться от бита ko: в правом столбце.Я пытаюсь использовать sed следующим образом:

echo "ko05414 ko:ITGA4" | sed 's/\(^ko\d{5}\)\tko:\(.*$\)/\1\2/'

, которая просто выводит исходную строку, которую я выводил.Я очень плохо знаком со сценариями командной строки, sed, pipe и т. Д., Поэтому, пожалуйста, не сердитесь, если / когда я делаю что-то чрезвычайно глупое.

Главное, что меня смущает, - то же самое происходит, если я поменяю бит \1\2 на значение \2\1 или просто использую одну группу.Это, я думаю, подразумевает, что я что-то упускаю из-за механизма передачи вывода echo в sed, или что мое регулярное выражение неверно, или я использую sed неправильно, или что sed не печатает результаты подстановки.

Любая помощь будет принята с благодарностью!

Ответы [ 4 ]

21 голосов
/ 21 июля 2010

sed выводит свой ввод, потому что подстановка не совпадает.Поскольку вы, вероятно, используете GNU sed, попробуйте следующее:

echo "ko05414     ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
  • \ d -> [0-9], поскольку GNU sed не распознает \ d
  • {}-> \ {\}, поскольку GNU sed по умолчанию использует базовые регулярные выражения.
10 голосов
/ 21 июля 2010

Это должно сделать это.Вы также можете пропустить последнюю группу и просто использовать вместо нее \1, но поскольку вы изучаете sed и regex, это хороший материал.Я хотел использовать группу без захвата в середине (:? ), но я не мог заставить ее играть с sed по какой-то причине, возможно, она не поддерживается.

sed --posix 's/\(^ko[0-9]\{5\}\)\( ko:\)\(.*$\)/\1 \3/g' file > result

И, конечно, вы можете использовать

sed --posix 's/ko://'
6 голосов
/ 21 июля 2010

Вам не нужно для этого sed

Вот как вы можете это сделать с помощью bash:

var="ko05414 ko:ITGA4"
echo ${var//"ko:"}

$ {var // "ko:"} заменяет все" ko: "на" "

Подробнее см. Управление строками

0 голосов
/ 22 июля 2010

@ OP, если вы просто хотите избавиться от "ko:", тогда

$ cat file
ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 ko:GZMA

$ awk '{sub("ko:","",$2)}1' file
ko04062 CXCR3
ko04062 CX3CR1
ko04062 CCL3
ko04062 CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 GZMA

Jsut a note.Хотя вы можете использовать чистую замену строки bash, она эффективнее только при изменении одной строки.Если у вас есть файл, особенно большой, использование цикла чтения bash все еще медленнее, чем использование sed или awk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...