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

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

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>

答え2

Sundeepの回答ありがとうございます。しかし、データをどれだけ信頼しているかに応じて、より簡単にすることができます。

最初の2回だけ見たい場合は、同じコマンドを2回呼び出すだけです。引用符の間に完全な単語/数字があるとし、空白以外の文字を選択します。これは-E正規表現を拡張できるためです。

テストファイル

Haarlem -m 'foo' -n 'bar' aalsmeer > "goes to"
Roterdam -m 'foo2' -n 'bar2' amsterdam > "goes to"
$ sed -E \
  -e "s/'\S+'/\"verified\"/" \
  -e "s/'\S+'/\"verifired\"/" test_file
#  
# Haarlem -m "verified" -n "verifired" aalsmeer > "goes to" -t 'value'
# Roterdam -m "verified" -n "verifired" amsterdam > "goes to" -t 'value'

関連情報