この正規表現置換が機能しないのはなぜですか?

この正規表現置換が機能しないのはなぜですか?

次の形式のファイルがあります。

$ cat myfile     
12 42956    Cinema - 3D/Multiplex    
7  12560    Status Update    
5  184   Movie  

テキストの説明に二重引用符を追加しようとしています。
次の正規表現が機能しない理由を理解できません。
$ sed -E 's/\b[0-9]+\b\s*\b[0-9]+\b\s*([^\s]+)/"\1"/g' myfile

私の質問は、同じことを行う他の方法ではなく、この正規表現に関するものです。私

答え1

私が知っている限り、Perl正規表現です\s。内部は「一つと一つ」を意味します。また、とが同じでも間にスペースがあるため一致しません。[[:blank:]]sed[ ... ]\s\s[^\s]+[^␣]+Status Update

置換は、すべての項目を二重引用符で囲まれた最初のセットに置き換えます。おそらく3つの列すべてをキャプチャしたいと思います。それ以外の場合は、次のような結果が出ます。ただ 最後の列。行全体を一致させるには、およびを使用して式を^最初と最後に固定し、最後から$フラグを削除する必要があります。g

選択する:

$ sed -E 's/[[:alpha:]].+/"&"/' myfile
12 42956    "Cinema - 3D/Multiplex    "
7  12560    "Status Update    "
5  184   "Movie  "

データが常に数値ではなく値で始まるように見えるので、最後の列を探します。この式は最初のアルファベット文字から始まり、行の残りの部分と一致し、すべての一致を二重引用符バージョンの一致と置き換えます。

質問のデータの末尾にスペースがあり、これは引用符に含まれています。末尾のスペースを防ぐには、次のようにします。

$ sed -E -e 's/[[:blank:]]*$//' -e 's/[[:alpha:]].+/"&"/' myfile
12 42956    "Cinema - 3D/Multiplex"
7  12560    "Status Update"
5  184   "Movie"

または、

while read -r a b c; do printf '%d\t%d\t"%s"\n' "$a" "$b" "$c"; done <myfile
12      42956   "Cinema - 3D/Multiplex"
7       12560   "Status Update"
5       184     "Movie"

答え2

sed -E 's/\b([0-9]+\b\s*\b[0-9]+)\b\s*([^\s]+)/\1 "\2"/g' myfile

これにより、テキストの周囲に二重引用符が追加されます。

あるグループに数字とスペースを保存し、別のグループ\1(\ 2)に文字列を保存し、sedはグループ1(\ 1)、スペース、二重引用符、および2番目のグループ(\ 2)を出力します。二重引用符。

([0-9, ]*)すべての数字とスペースを1つのグループにまとめ、数字の後のすべての項目を別のグループにまとめることで、これを短縮できます(.+)

これは以下を提供します:

sed -E 's/([0-9, ]*)(.+)/\1 "\2"/g' myfile
12 42956     "Cinema - 3D/Multiplex"
7  12560     "Status Update"
5  184    "Movie"

答え3

Mac OSXではサポートしてsedいないためです\sGNU sed\s

Mac OSXでは、ANSI-C引用符を使用しても\s機能しません。$''

$ echo $'1\t2 3' | sed 's/\s//g'
1   2 3
$ echo $'1\t2 3' | sed $'s/\s//g'
1   2 3

代わりに、次のものを使用できます。[[:space:]]

$ echo $'1\t2 3' | sed 's/[[:space:]]//g'
123

またはを使用できますが、タブ文字にANSI-C引用符が[ \t]必要です。$''

$ echo $'1\t2 3' | sed $'s/[ \t]//g'
123

関連情報