我们正在尝试删除以“内容”一词开头的行,但没有成功
“内容”一词实际上可以在文件开头或空格或制表符之后开始
sed 语法有什么问题?
sed "/^[ \t]*"content"\b/Id" file.txt
"version" : 9,
"Config" : {
"cluster_name" : "HDP",
"stack_id" : "HDP"
},
"properties" : {
"content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n#
"kafka_user_nproc_limit" : "65536"
.
.
file.txt 的预期输出
"version" : 9,
"Config" : {
"cluster_name" : "HDP",
"stack_id" : "HDP"
},
"properties" : {
"kafka_user_nproc_limit" : "65536"
.
.
答案1
sed
如果您所做的只是根据模式过滤行,则无需这样做。这就是grep
目的:
grep -iv '^[[:space:]]*"content"' < file.txt
grep -i
,与I
标准地址标志相反。
或者,如果这是一个正确的 JSON 文件,您可以使用 JSON 解析实用程序,例如jq
删除该键:
jq 'del(.properties.content)' < file.txt
答案2
我在这里看到两个问题:
- 模式中的双引号不会匹配,因为您使用双引号将表达式括起来
"
是非单词字符,所以不会有单词边界在它之后
所以
sed '/^[ \t]*"content"/Id' file.txt
或(如果必须在表达式两边使用双引号)
sed "/^[ \t]*\"content\"/Id" file.txt
答案3
我们可以使用下面的命令来完成
sed -e '/^\s*"content"/d' file.txt
输出
"version" : 9,
"Config" : {
"cluster_name" : "HDP",
"stack_id" : "HDP"
},
"properties" : {
"kafka_user_nproc_limit" : "65536"
.
.