从 JSON 解析后,如何删除任何空格(如果有)?
whereami -r
不使用 sed 来解析结果。
{
"ip": "95.16.15.10",
"country_code": "US",
"country_name": "United States",
"region_code": "NY",
"region_name": "New York",
"city": "The Bronx",
"zip_code": "10473",
"time_zone": "America/New_York",
"latitude": 40.822,
"longitude": -73.86,
"metro_code": 501
}
可以工作但需要空间。
whereami -r | sed -rn 's/(^.*city": ")(.*)(".*$)/\2/p'
The Bronx
使用以下方法对 JSON 结果进行排序sed -rn 's/(^.*city": ")(.*)(".*$)/\2/;s/ //p'
"ip": "95.16.15.10",
"country_code": "US",
"country_name": "United States",
"region_code": "NY",
"region_name": "New York",
TheBronx
"zip_code": "10473",
"time_zone": "America/New_York",
"latitude": 40.822,
"longitude": -73.86,
"metro_code": 501
我想要实现的目标
TheBronx
答案1
awk 对此没有问题
awk '
$1 == "\"city\":" {
$1 = ""
gsub(/ /,"")
sub(/^"/,"")
sub(/",$/,"")
print
}
'
我确信 sed 也能处理这个问题,但我从未管理过它的逻辑。但可以在网上看看,例如“sed oneliners”。
实践才能检验真相:
$ awk '
> $1 == "\"city\":" {
> $1 = ""
> gsub(/ /,"")
> sub(/^"/,"")
> sub(/",$/,"")
> print
> }
> '
{
"ip": "95.16.15.10",
"country_code": "US",
"country_name": "United States",
"region_code": "NY",
"region_name": "New York",
"city": "The Bronx",
"zip_code": "10473",
"time_zone": "America/New_York",
"latitude": 40.822,
"longitude": -73.86,
"metro_code": 501
}
TheBronx
答案2
您可以修改 sed 模式来替换空格。sed 允许链接模式。
's/(^.*city": ")(.*)(".*$)/\2/;s/ //p'
答案3
使用 sed 将适当列表形式的所有值提取到文件中。
sed 's/["{}\]//g' <your_file.json> | sed 's/,/\n/g' >> <your_new_file_to_save>
- sed's/regexp/replacement/g'输入文件名>输出文件名。
- 在某些版本的 sed 中,表达式前面必须加上 -e 来表明后面跟着一个表达式。
- s 代表替代,而 g 代表全局,这意味着行中所有匹配的内容都将被替换。我已将 [ ] 放入其中作为要从 .json 文件中删除的元素。
- 管道字符 | 用于将一个命令的输出连接到另一个命令的输入。最后我替换“,”并添加称为换行符的“\n”。
如果您想显示单个值,请参阅以下命令:
sed 's/["{}\]//g' <your_file.json> | sed 's/,/\n/g' | sed 's/<ur_value>//p'
例如你想提取 ip 的值
sed 's/["{}\]//g' file.json | sed 's/,/\n/g' | sed 's/ip : //p'
结果:-95.16.15.10
- 运行 p;这相当于上面的 /pattern match/! p,即“如果该行与 /pattern match/ 不匹配,则打印它”。因此,完整命令会打印从模式的第一次出现到最后一行的所有行,但会抑制匹配的行。