【发布时间】:2021-03-29 08:09:45
【问题描述】:
我想在文件的每一行中将最后一个匹配更改为 XXXX 给定文件格式:
"192.xx2" "someting" "another2321SD"
我想拥有:
"192.xx2" "someting" "XXXX"
仅使用 sed 我的解决方案:
sed -r 's/"(?:.(?!".+"))+$/XXXX/' file
【问题讨论】:
我想在文件的每一行中将最后一个匹配更改为 XXXX 给定文件格式:
"192.xx2" "someting" "another2321SD"
我想拥有:
"192.xx2" "someting" "XXXX"
仅使用 sed 我的解决方案:
sed -r 's/"(?:.(?!".+"))+$/XXXX/' file
【问题讨论】:
记住捕获中最后一对双引号之前的内容。
sed -r 's/^(.*)"[^"]*"$/\1"XXXX"/'
【讨论】:
请记住
(?:...) 是 non-capturing group 和 POSIX regex 不支持此构造(?!...) 是否定的 lookahead 并且 POSIX 正则表达式也不支持这种构造。要屏蔽最后一对双引号之间的所有内容,您可以使用
sed -r 's/(.*)".*"/\1"XXXX"/' file
sed 's/\(.*\)".*"/\1"XXXX"/' file
见sed demo:
s='"192.xx2" "someting" "another2321SD"'
sed -r 's/(.*)".*"/\1"XXXX"/' <<< "$s"
# => "192.xx2" "someting" "XXXX"
【讨论】:
" 是输入的最后一个字符:sed 's/"[^"]*"$/"XXXX"/' <<< "$s"。当您不确定时(或者当您为使用的每个双引号付费时),您可以使用rev < <(sed -r 's/[^"]+/XXXX/' <( rev <<<"$s"))。更糟糕的似乎是awk -F '"' 'BEGIN { OFS="\""} { $(NF-1)="XXXX"; print }' <<< "$s"。
awk,我认为可以有更多的假设。