使用sed替换两个字符之间匹配后的所有内容

时间:2015-12-21 18:01:06

标签: bash sed

我正在使用单词“line1”的日志,并且需要替换字符之间的单词后面的文本:和 可能的结果是:

xxx,\"line1\":\"C/O FRED FLINSTONE, MD\",xxx
xxx,\n       line1: 'C/O FRED FLINSTONE, MD',xxx
xxx,\\\"line1\\\":\\\"C\\\\/O FRED FLINSTONE\\\,MD",xxx

我想用“Redacted-Address1”替换“C / O FRED FLINSTONE,MD”,所以最终结果如下:

xxx,\"line1\":Redacted-Address1,xxx
xxx,\n line1:Redacted-Address1,xxx
xxx,\\\"line1\\\":Redacted-Address1,xxx

我不一定需要使用SED,但认为这是一个很好的起点。 xxx表示该行的重置(不是实际的xxx),因此我们无法通过搜索,我想保持不变。

更完整的数据示例如下:

,\"object\":{\"address\":[{\"city\":\"Bedrock\",\"line1\":\"C/O FRED FLINSTONE\, MD\",\"line2\":\"55101 Main St\",\"state\":\"TX\",\"use\":\"H\",\"zip\":69162}], 

期望的结果将是:

,\"object\":{\"address\":[{\"city\":\"Bedrock\",\"line1\":Redacted-Address1,\"line2\":\"55101 Main St\",\"state\":\"TX\",\"use\":\"H\",\"zip\":69162}], 

4 个答案:

答案 0 :(得分:1)

使用sed

sed -r '/line1/{s/([\]"line1[\]":)[\]"[^"]+",/\1Redacted-Address1,/}'

例如

echo ',\"object\":{\"address\":[{\"city\":\"Bedrock\",\"line1\":\"C/O FRED FLINSTONE\, MD\",\"line2\":\"55101 Main St\",\"state\":\"TX\",\"use\":\"H\",\"zip\":69162}], '|sed -r '/line1/{s/([\]"line1[\]":)[\]"[^"]+",/\1Redacted-Address1,/}'

输出

,\"object\":{\"address\":[{\"city\":\"Bedrock\",\"line1\":Redacted-Address1,\"line2\":\"55101 Main St\",\"state\":\"TX\",\"use\":\"H\",\"zip\":69162}],

答案 1 :(得分:1)

听起来你想要在private List<Enum> getEnumFromType(List<Bean.Var> vars, List<Enum> enums) { return new ArrayList<>( vars.stream() .map(var -> var.getType().substring(1)) .flatMap(s -> enums.stream() .filter(e -> s.equals(e.getName()))) .collect(Collectors.toSet()) ); } 之后的冒号和紧接在下一个冒号之前的昏迷之间获取所有内容。以下正则表达式应该通过替换除捕获组之外的所有内容来实现:

line1

答案 2 :(得分:0)

您可以将此sed用于贪婪的正则表达式:.*,,它将从:到最后,匹配:

sed 's/:.*,/:Redacted Name,/' file
xxx,\"line1\":Redacted Name,xxx
xxx,\n line1:Redacted Name,xxx
xxx,\\"line1\\":Redacted Name,xxx

根据以下评论:

sed "s/:..*['\"],/:Redacted Name,/" file
xxx,\"line1\":Redacted Name,xxx
xxx,\n line1:Redacted Name,xxx
xxx,\\"line1\\":Redacted Name,xxx

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's/\(line1[^:]*:\).*,/\1Redacted Name,/' file

这使用模式line1,后面的任何字符都不是:后跟:;然后贪婪(文件末尾的所有字符然后回溯直到找到,)。然后,匹配将由模式的后引用替换为第一个:和所需的字符串,后跟,