一重引用符間の単語を置き換える

一重引用符間の単語を置き換える

bashのfilで一重引用符の間の単語を置き換えようとしていますが、sedを試しましたが、うまくいきませんでした。

文書内容

Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to" -t 'value'
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to" -t 'value'

期待される出力

Haarlem -m "verified" -n "verified" aalsmeer > "goes to" -t 'value'
Roterdam -m "verified" -n "verified" amsterdam > "goes to" -t 'value'

以下のsedコマンドは機能しません

sed 's/-m '*.*' -n '*.*'/-m "verified" -n "verified"/'

ベストアンサー1

ここでは二重引用符を使用できます。

$ sed "s/'[^']*'/\"verified\"/g" ip.txt
Haarlem -m "verified" -n "verified" aalsmeer > "goes to"
Roterdam -m "verified" -n "verified" amsterdam > "goes to" 
  • '[^']*''文字以外の文字'の後に'文字が続くものと一致します。
    • 最初の入力行から最後の'.*'入力行まで一致するため、使用できません。''
  • \"verified\"代替文字列として使用される場合、"verified"二重引用符は二重引用符内で使用されるため、エスケープされます。

また見なさい:https://mywiki.wooledge.org/Quotesそして私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?(正規表現とワイルドカードの違い)


上記の解決策以降、質問が更新されました。

$ cat ip.txt
Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to" -t 'value'
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to" -t 'value'

$ sed -E "s/(-[mn] )'[^']*'/\1\"verified\"/g" ip.txt
Haarlem -m "verified" -n "verified" aalsmeer > "goes to" -t 'value'
Roterdam -m "verified" -n "verified" amsterdam > "goes to" -t 'value'
  • -[mn]一致-mする-n
  • (-[mn] )キャプチャグループであり、一致するコンテンツは、置き換えの部分で次のように再利用されます。\1

また、使用することができます

sed -E "s/(-[^t] )'[^']*'/\1\"verified\"/g" ip.txt

置換のみを防止し、スペースが前にある他のすべての単一引用符パターン-t '..'と一致します。-<char>

おすすめ記事