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>