sed或awk在一行的最后100个字符中查找字符串或删除该行

时间:2015-03-03 03:58:18

标签: regex bash awk sed

第一个问题,希望我能很好地形成它。

我希望匹配一个字符串,即一行的最后100个字符中的“lang”:“en”,如果没有匹配,则删除该行。

我尝试过使用sed

sed '/"lang":"en"/!d' file > output

但不幸的是,很多行都有不止一次的字符串,我只关心它的最后一次出现。

我正在学习sed,但对awk一无所知,我的大多数搜索都提出了“文件中的第一个/最后一个实例”,而不是“在一行中”所以任何帮助学习最好的这样做的方法会很棒。感谢。

3 个答案:

答案 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个其他字符