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'