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

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

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

$ 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"

おすすめ記事