試試這個。儘管如此,在評論和文字方面卻忽略了大括號,因爲David Gelhar警告過。它只找到並刪除第一次出現的「@ForTestingOnly」塊(假設只有一個)。
#!/bin/bash
find . -maxdepth 1 | while read -r file
do
open=0 close=0
# start=$(sed -n '/@ForTestingOnly/{=;q}' "$file")
while read -r line
do
case $line in
*{*) ((open++)) ;;
*}*) ((close++));;
'') : ;; # skip blank lines
*) # these lines contain the line number that the sed "=" command printed
if ((open == close))
then
break
fi
;;
esac
# split braces onto separate lines dropping all other chars
# print the line number once per line that contains either { or }
# done < <(sed -n "$start,$ { /[{}]/ s/\([{}]\)/\1\n/g;ta;b;:a;p;=}" "$file")
done < <(sed -n "/@ForTestingOnly/,$ { /[{}]/ s/\([{}]\)/\1\n/g;ta;b;:a;p;=}" "$file")
end=$line
# sed -i "${start},${end}d" "$file"
sed -i "/@ForTestingOnly/,${end}d" "$file"
done
編輯:刪除一個呼叫sed
(註釋掉和更換幾行)。
編輯2:
這裏的主要sed
線的故障:
sed -n "/@ForTestingOnly/,$ { /[{}]/ s/\([{}]\)/\1\n/g;ta;b;:a;p;=}" "$file"
-n
- 只有明確要求
/@ForTestingOnly/,$
當打印線 - 從包含該行「@ ForTestingOnly「到文件末尾
s/ .../... /g
執行全局(每行)替代
\(... \)
- 捕捉
[{}]
- 替代什麼被抓獲加上一個換行符
ta
- - 出現在列表bewteen方括號
\1\n
的字符,如果分支標籤爲「a」
b
- 分支(無標籤意味着「結束並再次開始下一行的每行週期) - 該分支作爲ta
的」其他「功能,我本可以使用T
代替ta;b;:a
,但sed
一些版本不支持T
:a
- 標籤「一」
p
- 打印線(實際上,打印模式緩衝區現在由可能有多個線路用「{ 「或‘}’上各一個)
=
- 打印輸入文件
第二sed
命令簡單地說,刪除開始於具有目標串和結束一個行的當前行號在...處由while
循環找到的線。
我頂部的sed
命令說我找到目標字符串並打印它的行號並退出。因爲主要的sed
命令正在照顧在正確的地方開始,所以這條線是沒有必要的。
內部while
循環查看主sed
命令的輸出並增加每個大括號的計數器。當計數匹配時,它停止。
外部的while
循環遍歷當前目錄中的所有文件。
你應該明確地提一下爲什麼用「java」標籤標記這個問題,我只能懷疑@ForTestingOnly是一個Java註釋... – bobah 2010-05-10 16:34:18
小心發佈你到目前爲止的內容嗎? – 2010-05-10 16:34:28
這將是非常容易做到這一點*幾乎*正確的,因爲你描述它,但要小心諸如評論或字符串文字裏面的「}」字符...... – 2010-05-10 16:42:34