Linux搜索并替换字符串中的模式案例

时间:2015-06-25 23:41:53

标签: regex awk sed

一直在努力想办法做到这一点。基本上我需要在表示uri的字符串中将{}中包含的任何的情况从低位更改为高位(并且还删除括号但我可以使用sed来执行此操作)

E.g

/logs/{server_id}/path/{os_id}

/logs/SERVER_ID/path/OS_ID

字符串其余部分的情况必须保留在较低的位置,这就是打败我的情况。到目前为止看着sed,awk,tr与正则表达式的组合。任何帮助赞赏。

4 个答案:

答案 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