第一个问题,希望我能很好地形成它。
我希望匹配一个字符串,即一行的最后100个字符中的“lang”:“en”,如果没有匹配,则删除该行。
我尝试过使用sed
sed '/"lang":"en"/!d' file > output
但不幸的是,很多行都有不止一次的字符串,我只关心它的最后一次出现。
我正在学习sed,但对awk一无所知,我的大多数搜索都提出了“文件中的第一个/最后一个实例”,而不是“在一行中”所以任何帮助学习最好的这样做的方法会很棒。感谢。
答案 0 :(得分:4)
这适用于任何Posix awk:
awk 'match(substr($0,length-99),/"lang":"en"/)' file
您可以使用简单的字符串查找而不是正则表达式来完成此操作,但字符串更难以输入:
awk 'index(substr($0,length-99),"\"lang\":\"en\"")' file
两者都只提取每行的最后100个字符,如果在子字符串中找到测试模式,则打印该行(print是默认操作,因此程序仅包含条件。)
答案 1 :(得分:1)
对于简单的基于正则表达式的解决方案,
grep -E '"lang":"en".{0,89}$' file
我从最大金额中减去"lang":"en"
的长度,假设您的意思是必须完全在最后100个字符内找到该字符串。
这看起来就像您正在尝试处理JSON数据一样,所以也许您可以提出一个更好的,基于结构的规则,并使用jq
代替。
jq 'select(path["to"]["lang"] == "en")' file
在结构"en"
中查找"path": { ... "to": { ..., "lang": "en" ...} } }
。这对于JSON中的换行,"lang": "en"
中的间距变化等
答案 2 :(得分:0)
sed '/"lang":"en".\{0,89\}$/!d' file > output
在选择结尾之前添加可能的89个其他字符