Подтвердить что ты не робот

Захват групп в sed

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

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/'

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

sed --posix 's/ko://'

Ответ 3

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

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

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

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

См. Манипулирование строк для получения дополнительной информации

Ответ 4

@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

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