2016-03-23 31 views
0

私は、文字列を持っていることなどのように、単一の文字を囲む括弧付き:sed - 角かっこを文字に置き換えていますか?

[a] 

が、私は括弧内の文字を取ると文字とブラケットを交換したいので、最終的な結果は次のようになります。

aaa 

これは私が思い付いたものですが、それは動作しません:

sed 's/\[ \([a-z]\) \]/\2/g' < testfile 

誰かが私を助けて、と説明していただけますなぜ私のコマンドは機能していないのですか?

+1

ためのパターン内のスペースは何ですか?どのパターン(パターンから)が '\ 2 'になるのでしょうか? 5文字を1文字に置き換えています。それはあなたが意味することですか? –

+0

スペースを削除し、 '\ 1'を3倍します。つまり、' sed 's/\ [\([az] \)\]/\ 1 \ 1 \ 1/g " –

+2

' sed -e' s/[\(。\)\]/\ 1 \ 1 \ 1/g '' – DigitalRoss

答えて

0

私はあなたがいくつかの基本的な概念を忘れてしまったと思います。まずは

$ echo a | sed -r 's/(.)/\1\1/' 
aa 

括弧はグループを示し、\1は、角括弧内の文字と一致し、それを3倍に、今、最初のグループ

を参照する単一の文字を複製してみましょう。

$ echo [a]b | sed -r 's/\[(.)\]/\1\1\1/' 
aaab 

大括弧の文字は正規表現で特別な意味を持つため、エスケープする必要があります。重要なのは、括弧の中にあなたが興味を持っている正規表現を括弧でくくって、\{number}という表記で同じ順序でそれらを参照しなければならないということです。

0

問題あなたの摂餌sed 's/\[ \([a-z]\) \]/\2/g' < testfileで:

1) The pattern has only one group \([a-z]\), so \2 is invalid; 
2) The pattern contains space, there is no match found; 
3) To replace brackets, you need to capture them in a group. 

私の考えは、パターン内のすべてのグループをキャッチし、\2\2\2でそれらを置き換えるために、次のとおりです。

echo "[a]" | sed 's/\(\[\)\([a-z]\)\(\]\)/\2\2\2/g' 

それとも

echo "[a]" | sed 's/\(.\)\(.\)\(.\)/\2\2\2/g' 

出力は

です。
aaa 
0

次のコードを試してみてください。

$ echo "[a]" | sed 's/\[\([a-zA-Z]\)\]/\1\1\1/g' 

または

$ echo "[a]" | sed -r 's/\[([a-zA-Z])\]/\1\1\1/g' 

を出力:

aaa 
関連する問題