[英]stopping 'sed' after match found on a line; don't let sed keep checking all lines to EOF
我有一個文本文件,其中每一行上的每個第一文本塊都由一個制表符與第二個文本塊隔開,如下所示:
VERBS, AUXILIARY. "Be," subjunctive and quasi-subjunctive Be, Beest, &c., was used in A.-S. (beon) generally in a future sense.
如果很難分辨,制表符在“准虛擬”和“ Be”之間留有很長的間隔。
因此,我想到了一個“ for”循環,其中使用“ sed”設置變量來讀取一行的第一行文本,直到並包括制表符(或沒有,這都不重要) ),然后使用'var'查找后續匹配項,並在制表符前添加“(x)”以使該行唯一。 “ x”當然是一個運行計數器,第一個實例為“ 1”,然后遞增,然后每個后續匹配都高一個。
我看到的一個問題是,在以后的每次匹配后都停止“ sed”操作,因此計數器可以遞增。 有沒有辦法做到這一點,因為“ sed”的正常行為是不斷地直通(據我所知),直到處理完所有行。
您可以將IFS
設置為TAB
字符,並將該行讀入變量。 就像是:
$ while IFS=$'\t' read block1 block2;do
echo "block1 is $block1"
echo "block2 is $block2"
done < file
block1 is VERBS, AUXILIARY. "Be," subjunctive and quasi-subjunctive
block2 is Be, Beest, &c., was used in A.-S. (beon) generally in a future sense.
好的,所以我用這個小腳本(如果殺傷力太大,也許就大了)完成任務:
#!/bin/bash
sedLnCnt=1
while [[ "$sedLnCnt" -lt 521 ]] ; do
lN=$(sed -n "${sedLnCnt} p" sGNoSecNums.html|sed -r 's/^([^\t]*\t).*$/\1/') #; echo "\$lN: $lN"
lnNum=($(grep -n "$lN" sGNoSecNums.html|sed -r 's/^([0-9]+):.*$/\1/')) #; echo "num of matches: ${#lnNum[@]}"
if [[ "${#lnNum[@]}" -gt 1 ]] ; then #'if'
lCnt="${#lnNum[@]}"
((eleN = $lCnt-1)) #; echo "\$eleN: ${eleN}" # var $eleN needs to be 1 less than total line count of zero-based array
while [[ "$lCnt" -gt 0 ]] ; do
sed -ri "${lnNum[$eleN]}s/^([^\t]*)\t/\1 \(${lCnt}\)\t/" sGNoSecNums.html
((lCnt--))
((eleN--))
done
fi
((sedLnCnt++))
done
Grep是查找匹配的行號,將它們塞入數組然后編輯每行並附加唯一標識符的理想方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.