我正在尝试从文件中删除特定文本。我尝试使用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"}