Захват групп в 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 не печатает результаты подстановки.
Любая помощь будет принята с благодарностью!
Ответы
Ответ 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.