2015-03-03 33 views
2

第一個問題,所以希望我能很好地形成它。Sed或awk在一行的最後100個字符中查找一個字符串或刪除行

我期待在一行的最後100個字符中匹配一個字符串,即「lang」:「en」,如果沒有匹配,請刪除該行。

我試圖用做

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

但遺憾的是很多線路有串不止一次,我只關心它的最終發生的sed。

我還在學習sed,但對awk一無所知,大部分搜索都提出了「文件中的第一個/最後一個實例」而不是「排成一行」,所以在學習最好的辦法是做到這一點。謝謝。

+0

什麼SED? – 2015-03-03 04:09:34

+0

@Emil Kakkau,如何將文件的最後200個字節傳送給'sed'有什麼幫助? Hedekar在一行的最後100個字符中尋找'「lang」:「en」... _並且還說...「但不幸的是,許多行都有這個字符串不止一次,我只關心最後一次它。」。所以我不明白這是如何有用的! – user3439894 2015-03-03 04:22:24

+0

@ user3439894看看他的問題:「在最後100個字符中查找字符串」。所以進一步的管道會讓他在最後的100個字符中找到。完全像'tail -c 200 file.search | grep「lang」; echo $?'會表明有某物。因此問題的答案,但實際上我不確定這是否符合他的需要只是一個評論,也因爲沒有完全指出。 – 2015-03-03 04:28:25

回答

4

這應該與任何Posix的工作awk的:

awk 'match(substr($0,length-99),/"lang":"en"/)' file 

你可以用一個簡單的字符串找去做,而不是一個正則表達式,但該字符串是比較煩人鍵入:

awk 'index(substr($0,length-99),"\"lang\":\"en\"")' file 

兩者都簡單地提取每行的最後100個字符,並且如果在子串中找到測試模式,則打印該行(打印是默認動作,因此程序僅包含該條件。)

+0

很酷,謝謝你教我一些關於awk的信息。 – Hedekar 2015-03-04 05:56:14

1

對於一個簡單的基於正則表達式的解決方案,

grep -E '"lang":"en".{0,89}$' file 

我減去"lang":"en"長度從最大量,假設你指的是字符串必須完全的最後100個字符中找到。

這看起來像是您正在嘗試處理JSON數據,因此您可能會想出更好的基於結構的規則,並使用jq代替。

jq 'select(path["to"]["lang"] == "en")' file 

找到結構"path": { ... "to": { ..., "lang": "en" ...} } }"en"。這也將是針對在JSON換行符健壯,間隔變化"lang": "en"

0
sed '/"lang":"en".\{0,89\}$/!d' file > output 

在選擇結束前添加89可能其他炭約管道`尾-c 200`到

+0

向我展示我剛剛沒有收到的sed格式的要點。謝謝。 – Hedekar 2015-03-04 05:57:01

相關問題