web-dev-qa-db-ja.com

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

エコーした元の文字列を出力するだけです。私はコマンドラインスクリプト、sed、パイプなどに非常に慣れていないので、極端にばかげたことをしているときや怒っているときは怒らないでください。

私を混乱させる主なことは、\1\2ビットを反転して\2\1を読み取るか、1つのグループを使用するだけでも同じことが起こるということです。これは、おそらく、エコーの出力をsedにパイプする仕組みについて何か欠けていること、または正規表現が間違っていること、またはsedを間違って使用していること、またはsedが置換の結果を出力していないことを意味します。

どんな助けでも大歓迎です!

23
Mike Dewar

置換が一致しないため、sedは入力を出力しています。おそらくGNU sedを使用しているので、これを試してください:

echo "ko05414     ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
  • \ d-> [0-9] GNU sedが\ dを認識しないため
  • {}->\{\} GNUデフォルトでsedなので、基本的な正規表現を使用します。
21
ninjalj

これでうまくいくはずです。最後のグループをスキップして、代わりに\1を使用することもできますが、sedとregexを学習しているので、これは良いことです。途中で非キャプチャグループを使用したかった(:? )が、何らかの理由でsedで遊ぶことができなかった。おそらくサポートされていない可能性がある。

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

もちろん使用できます

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

このためにsedする必要はありません必要ありません

これがbashでそれを行う方法です:

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

$ {var // "ko:"}は、すべての "ko:"を ""に置き換えます

詳細は 文字列の操作 を参照してください

6
getekha

@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のメモ。純粋なbash文字列置換を使用できますが、単一の文字列を変更する場合にのみ効率的です。ファイル、特に大きなファイルがある場合、bashのwhile読み取りループを使用しても、sedまたはawkを使用するよりも低速です。

0
ghostdog74