一直在努力想办法做到这一点。基本上我需要在表示uri的字符串中将{}中包含的任何的情况从低位更改为高位(并且还删除括号但我可以使用sed来执行此操作)
E.g
/logs/{server_id}/path/{os_id}
要
/logs/SERVER_ID/path/OS_ID
字符串其余部分的情况必须保留在较低的位置,这就是打败我的情况。到目前为止看着sed,awk,tr与正则表达式的组合。任何帮助赞赏。
答案 0 :(得分:1)
sed "s/{\([^{}]*\)}/\U\1/g"
这可以通过匹配{}
中包含的所有文本并将其替换为大写版本来实现。
echo "/logs/{server_id}/path/{os_id}" | sed "s/{\([^{}]*\)}/\U\1/g"
结果为/logs/SERVER_ID/path/OS_ID
。
答案 1 :(得分:0)
echo "/logs/{server_id}/path/{os_id}" \
| sed 's#{\([^{}][^{}]*\)}#\U\1#;s#{\([^{}][^{}]*\)}#\U\1#'
<强>输出强>
/logs/SERVER_ID/path/OS_ID
您似乎错过的解决方案的一部分是“捕获群组”&#39;在sed中可用,即\(regex\)
。然后由\1
引用。如果您是真正的受虐狂,您可以拥有1-9
个捕获群体的任何地方; - )
另请注意,我只重复相同的cmd 2次,因为第一个{...}
对已转换为UC版本(不包围{}
s),因此仅保留{...}
目标将匹配。
[^{}][^{}*
可能有更简洁的语法,但这几乎适用于任何追溯到80年代的sed
。我似乎记得有些sed
不支持\U
指令,但对于我有权访问的系统,这可行。
这有帮助吗?
答案 2 :(得分:0)
$ awk '{
while(match($0,/{[^}]+}/))
$0=substr($0,1,RSTART-1) toupper(substr($0,RSTART+1,RLENGTH-2)) substr($0,RSTART+RLENGTH)
}1' file
/logs/SERVER_ID/path/OS_ID
答案 3 :(得分:0)
这个处理任意数量和格式的大括号:
echo "/logs/{server_id}/path/{os_id}/{foo}" | awk -v RS='{' -v FS='}' -v ORS='\0' -v OFS='\0' '!/}/ { print } /}/ { $1 = toupper($1); print}'
输出:
/logs/SERVER_ID/path/OS_ID/FOO