如何删除某一行的特定部分?

如何删除某一行的特定部分?

我正在尝试从文件中删除特定文本。我尝试使用sed

sed 's/.*,/{/' beta.txt | head -n5

但没有得到预期的输出。
这是我得到的输入和输出:

{"url":"example.com","original":"ex.com","tech":"c"}
{"url":"example1.com", jkdshsjkfhdj,"dsd":"sdsd","original":"ex1.com","tech":"d"}

我得到的输出是:

{"tech":"c"}
{"tech":"d"}

我期望的是:

{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

我只想拥有original并且它之前的所有内容都应该被 替换{

我怎样才能实现它?

答案1

由于正则表达式过于贪婪,所以您没有得到预期的结果。匹配除逗号[^,]以外的任何字符:

$ sed 's/[^,]*,/{/' beta.txt
{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

不过,自从您进行编辑以来,显然除了明确地匹配之外,所有行上都没有什么一致的东西original,所以我们必须这样做......没什么乐趣。

sed 's/.*,"original/{"original/'

答案2

另一个:

# sed 's/\".*com,//' sedtest
{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

编辑:-i如果要更改某些文件, 请使用标志。例如:

sed -i.bak 'regex_above' filename

在参数上加一个点-i会创建一个名为文件名.bak也在同一个目录中。

答案3

这里应该问的正确问题是“如何只在json字典中保留特定条目”,因为这正是您示例中所见的。当然,可以通过其他文本处理工具来实现,但如果我们使用json,那么让我们使用适当的工具来实现。

使用 python 的json模块,我们可以得到如下所示的小脚本,其中列出了要保留的项目。假设您的输入文件的结构是json每行一个字典,我们可以逐行读取文件,并将每行加载为 python 的字典。从那里开始就是胜利之路 - 遍历字典中的所有键,看看它们是否在我们想要保留的项目列表中;如果它们不在该列表中 - 将它们弹出。

#!/usr/bin/env python
import json,sys
keep = ['tech','original']
with open(sys.argv[1]) as f:
    for line in f:
        data=json.loads(line)
        for key in data.keys():
           if key not in keep: 
               data.pop(key)
        json.dump(data,sys.stdout)
        print ""

测试运行:

$ cat input.json                                                                                      
{"url":"example.com","original":"ex.com","tech":"c"}
{"url":"example1.com","dsd":"sdsd","original":"ex1.com","tech":"d"}
$ ./remove_json_items.py input.json                                                                   
{"tech": "c", "original": "ex.com"}
{"tech": "d", "original": "ex1.com"}

答案4

您还可以包含“原始”标签:

's/{.*,"original"/{"original"/' beta.txt

输出:

{"original":"ex.com","tech":"c"}
{"original":"ex1.com","tech":"d"}

相关内容