2016-08-17 9 views
1

私はsedを置き換える問題にちょっと悩まされています。Sedが行頭の最初の文字に置き換えられます

stuff1 \t names names names 
stuff2 \t \t names names names 
stuff3 \t \t names names names 
stuff4 \t names names names 

私は何をしたいが、それはそれらの間の最初の単語を挿入すること、のように二重のタブを置き換えるです:私はこのようになり、タブ区切りファイルを、持っています。このように:私が試した何

stuff2 \t stuff2 \t names names names 
stuff3 \t stuff3 \t names names names 

sed 's/\t\t/\t(.*\t\t\)\t/' 

だったが、私はエスケープグループと交換しようとすると、それは文字通りそれを取り、

\t\t 

へのすべての発生を変更します

\t(.*\t\t\)\t 

「エスケープ・グループから脱出する」方法はありますか?

答えて

1

ただ、このようにそれらを一致:

$ sed -r 's/^(\S+)\t\t/\1\t\1\t/g' file 
stuff1 names names names 
stuff2 stuff2 names names names 
stuff3 stuff3 names names names 
stuff4 names names names 

これは、次のとおりです。

  • s/find/replacement/g
    findを見つけ、replacementg loballyでそれを置き換えるために完全な表現。
  • ^(\S+)\t\t
    は、行の先頭に単語が続きます([^\t]*と言うこともできます)。次に、2つのタブに一致させます。
  • \1\t\1\t
    キャプチャされたマッチに続いてタブが表示され、その後にもう一度表示されます。
  • -r
    このsedフラグはあなただけで(...)の代わり\(...\)でグループをキャッチできるようにする拡張正規表現を持っているために使用されます。ところで

、私には、あなたのコマンドの出力は次のようになります。

$ sed 's/\t\t/\t(.*\t\t\)\t/' file 
stuff1 names names names 
stuff2 (.* ) names names names 
stuff3 (.* ) names names names 
stuff4 names names names 

あなたが交換部品で.*を使用しているので、それは通常のよう文字通りなく取られているので表現。

+1

ああ、ありがとう! –

関連する問題