【问题标题】:How to use grep/awk/sed to print until a certain character?如何使用 grep/awk/sed 打印到某个字符?
【发布时间】:2020-08-13 10:55:06
【问题描述】:

我是一个完整的 shell 脚本初学者,我正在尝试遍历一组 JSON 文件并尝试从中提取某个字段。每个 JSON 文件都有一个 "country:"xxx" 字段。在每个 JSON 文件中,有 10k 个具有相同国家名称的相同字段,所以我只需要第一次出现,我可以使用“-m 1”。

我尝试为此使用 grep,但无法弄清楚如何在第一次出现时从每个文件中提取包括国家名称在内的整个字段。

for FILE in *.json;
do   
        grep -o -a -m 1 -h -r '"country":"' $FILE;
done

我尝试使用另一个管道并使用以下模式,但它不起作用

| egrep -o '^[^"]+'

实际输出:

"country":"
"country":"
"country":"

期望的输出:

"country:"romania"
"country:"united kingdom"
"country:"tajikistan"

但我需要整件事。任何帮助都会很棒。谢谢

【问题讨论】:

  • Each JSON file 所以使用 JSON 解析器,而不是 grep。
  • 请编辑带有明确出席结果的问题
  • 请注明您想要的输出。您是否从输入文件中要求一组独特的国家/地区?还是您只想从 each 文件返回第一个国家/地区?您当前获得的输出是因为您指定了-o - 这将只输出字符串的匹配部分,而不是该行的其余部分
  • @arco444 我只需要每个文件中的第一个国家。如果我去掉 -o,我会得到很多东西,因为在 country 字段之后还有其他字段。

标签: bash shell grep


【解决方案1】:

关于“我只想要第一次出现”的问题有一个通用答案,答案是:

... | head -n 1

这意味着,无论你做什么:占据头部(第一行),-n 开关让你可以说出你想要多少(在本例中为一个)。

可以对最后出现的事件执行相同的操作,但是您使用 tail 而不是 head(您也可以使用 -n 开关)。

【讨论】:

  • 感谢您的评论。我已经可以使用“-m 1”获得第一次出现。
  • @Cugomastik:您需要从 grep 中删除 -o:这仅显示正则表达式,而您需要包含正则表达式的整行。
【解决方案2】:

在尝试了很多事情之后。我找到了我正在寻找的模式。

grep -Po '"country":.*?[^\\]",' $FILE | head -n 1;

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多