我想在文件中搜索「xxxx」模式,並在此模式之前刪除5行,在此次匹配之後刪除6行。我如何使用Sed做到這一點?如何在使用sed模式匹配之前刪除5行之前和6行?
2
A
回答
3
這裏有一種方法可以使用awk來完成。我假設你也想刪除的行本身和文件小到足以放入內存:
awk '{a[NR]=$0}/xxxx/{f=NR}END{for(i=1;i<=NR;++i)if(i<f-5||i>f+6)print a[i]}' file
商店每行入陣a
。當匹配的模式/xxxx/
時,保存行號。整個文件處理完畢後,循環訪問數組,只打印要保留的行。
或者,也可以使用grep首先獲得的行號:
grep -n 'xxxx' file | awk -F: 'NR==FNR{f=$1}NR<f-5||NR>f+6' - file
在兩種情況下,刪除將被周圍的最後一行,其中模式匹配的行。
第三種選擇是用grep獲得的行號,然後用sed刪除行:
line=$(grep -nm1 'xxxx' file | cut -d: -f1)
sed "$((line-5)),$((line+6))d" file
在這種情況下我還添加了-m
開關找到第一個之後這樣的grep退出比賽。
1
,如果你知道,行號(究竟是不是很難獲得),可以使用類似的東西:
filename="test"
start=`expr $curr_line - 5`
end=`expr $curr_line + 6`
sed "${start},${end}d" $filename (optionally sed -i)
當然
,你必須要記住的附加條件,如啓動不應該小於1並結束大於文件中的行數。
3
這可能爲你工作(GNU SED):
sed ':a;N;s/\n/&/5;Ta;/xxxx/!{P;D};:b;N;s/\n/&/11;Tb;d' file
保持5行滾動窗口,並在遇到指定的字符串添加6個(11個)和刪除。
N.B.這是一個barebones
解決方案,很可能需要根據您的特定需求進行定製。問題如:如果整個文件中有多個字符串呢?如果字符串在前五行或者多個字符串在彼此的五行之內等等,等等等等。
0
另一個 - 也許更容易遵循 - 解決方案將使用grep
找到關鍵字和相應的行:
grep -n 'KEYWORD' <file>
然後使用sed
只得到這樣的行號:
grep -n 'KEYWORD' <file> | sed 's/:.*//'
現在,你有行號只需使用sed
這樣的:
sed -i "$(LINE_START),$(LINE_END) d" <file>
刪除之前和/或之後的行!只有-i
您將覆蓋<file>
(無備份)。
腳本例子是:
#!/bin/bash
KEYWORD=$1
LINES_BEFORE=$2
LINES_AFTER=$3
FILE=$4
LINE_NO=$(grep -n $KEYWORD $FILE | sed 's/:.*//')
echo "Keyword found in line: $LINE_NO"
LINE_START=$(($LINE_NO-$LINES_BEFORE))
LINE_END=$(($LINE_NO+$LINES_AFTER))
echo "Deleting lines $LINE_START to $LINE_END!"
sed -i "$LINE_START,$LINE_END d" $FILE
請注意,如果關鍵字被發現一次,這隻會工作!根據您的需求調整腳本!
相關問題
- 1. sed多行刪除之前模式
- 2. 如何在模式之前和行號之後使用sed插入一行?
- 3. 在匹配模式之後/之前添加/刪除單詞
- 4. 我需要使用sed找到一個匹配,並且在此匹配之前刪除2行,之後刪除2行
- 5. Perl或Sed命令在匹配表達式之前刪除內容
- 6. 刪除匹配行的sed
- 7. 在第一個實例之前和之後刪除Sed命令
- 8. 如何刪除一行之前和兩個字符串之後?
- 9. 在tcl中發現模式之前和之後刪除所有行
- 10. sed,刪除一行在另一個之前
- 11. 如何刪除任何東西在兩個匹配模式之前和之後R
- 12. 在字符串匹配之前和之後的Python插入行
- 13. SED刪除匹配和下一行
- 14. 如何刪除行匹配標準和行與之相鄰
- 15. Python - 刪除行之前的換行符?
- 16. SKNode在刪除之前執行動畫
- 17. NHibernate在刪除它之前更新行?
- 18. 高清:如何刪除系列空間(之前和之前)
- 19. 如何使用sed刪除匹配的行,上面的行和下面的行?
- 20. 在匹配模式之前獲得單個匹配嗎?
- 21. awk:匹配之前和之後的輸出行
- 22. 刪除除匹配花樣行最佳實踐(sed)之外的所有行
- 23. 如何使用sed刪除多行上兩種模式之間的內容?
- 24. 刪除匹配行前後的某一行和行
- 25. 模式之前更換sed的
- 26. 在樹狀行之間的sed刪除
- 27. 如何匹配Perl中模式匹配前後的行?
- 28. 在模式之前添加新行
- 29. SQL Server - 在刪除行之前如何檢查一行可刪除
- 30. 在讀取「powerquery」之前跳過6行