第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在兩種模式之間打印行,包括還是獨(dú)占(在sed、AWK或Perl中)?

如何在兩種模式之間打印行,包括還是獨(dú)占(在sed、AWK或Perl中)?

胡子哥哥 2019-06-03 16:13:38
如何在兩種模式之間打印行,包括還是獨(dú)占(在sed、AWK或Perl中)?我有一個(gè)類似于下面的文件,我想打印兩個(gè)給定模式之間的線條PAT1和PAT2.1 2 PAT1 3    - first block 4 PAT2 5 6 PAT1 7    - second block PAT2 8 9 PAT1 10    - third block我讀過(guò)如何在使用awk/sed時(shí)多次出現(xiàn)的兩個(gè)標(biāo)記模式之間選擇行?但我很好奇地看到所有可能的組合,包括或排除模式。如何打印兩種模式之間的所有線條?
查看完整描述

3 回答

?
MYYA

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊

PAT1和PAT 2之間的打印線

$ awk '/PAT1/,/PAT2/' file
PAT13    - first block4PAT2
PAT17    - second block
PAT2
PAT110    - third block

或者,使用變量:

awk '/PAT1/{flag=1} flag; /PAT2/{flag=0}' file

這是怎么回事?

  • /PAT1/

    匹配具有此文本的行,以及

    /PAT2/

    的確如此。
  • /PAT1/{flag=1}

    設(shè)置

    flag

    當(dāng)文本

    PAT1

    是在一行中找到的。
  • /PAT2/{flag=0}

    取消設(shè)置

    flag

    當(dāng)文本

    PAT2

    是在一行中找到的。
  • flag

    是具有默認(rèn)操作的模式,即

    print $0

    *如果

    flag

    等于1這一行是打印出來(lái)的。這樣,它就可以打印所有從時(shí)間上出現(xiàn)的線條。

    PAT1

    發(fā)生,直到下一個(gè)

    PAT2

    都被看到了。這還將打印最后一次匹配的線條。

    PAT1

    直到文件的末尾。

PAT1和PAT 2之間的打印線-不包括PAT 1和PAT 2

$ awk '/PAT1/{flag=1; next} /PAT2/{flag=0} flag' file3    - first block47    - second block10    - third block

這個(gè)用next跳過(guò)包含PAT1為了避免被打印出來(lái)。

這個(gè)電話next可以通過(guò)重新設(shè)置塊來(lái)丟棄:awk '/PAT2/{flag=0} flag; /PAT1/{flag=1}' file.

PAT1和PAT 2之間的打印線-包括PAT1

$ awk '/PAT1/{flag=1} /PAT2/{flag=0} flag' file
PAT13    - first block4PAT17    - second block
PAT110    - third block

通過(guò)放置flag最后,它觸發(fā)在PAT1或PAT 2上設(shè)置的操作:在PAT 1上打印,而不是在PAT 2上打印。

PAT1和PAT 2之間的打印線-包括PAT 2

$ awk 'flag; /PAT1/{flag=1} /PAT2/{flag=0}' file3    - first block4PAT27    - second block
PAT210    - third block

通過(guò)放置flag在開(kāi)始時(shí),它會(huì)觸發(fā)先前設(shè)置的操作,從而打印結(jié)束模式,而不是開(kāi)始模式。

PAT1和PAT2之間的打印行-如果沒(méi)有發(fā)生其他pat 2,則不包括從最后一個(gè)pat 1到文件末尾的行。

這是基于埃德·莫頓的一個(gè)解決方案.

awk 'flag{
        if (/PAT2/)
           {printf "%s", buf; flag=0; buf=""}
        else
            buf = buf $0 ORS
     }
     /PAT1/ {flag=1}' file

作為一條單線:

$ awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file3    - first block47    
- second block# note the lack of third block, since no other PAT2 happens after it

這會(huì)將所有選定的行保存在一個(gè)緩沖區(qū)中,該緩沖區(qū)從找到PAT 1時(shí)開(kāi)始填充。然后,它將一直填充以下行,直到找到PAT 2為止。在這一點(diǎn)上,它打印存儲(chǔ)的內(nèi)容并清空緩沖區(qū)。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊

那經(jīng)典呢?sed解決辦法?

pat 1和pat 2之間的打印線-包括pat 1和pat 2。

sed -n '/PAT1/,/PAT2/p' FILE

PAT1和PAT 2之間的打印線-排除PAT1和PAT 2

GNUsed

sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p}}' FILE

任何sed1

sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p;};}' FILE

甚至(謝謝)孫迪普):

GNUsed

sed -n '/PAT1/,/PAT2/{//!p}' FILE

任何sed

sed -n '/PAT1/,/PAT2/{//!p;}' FILE

PAT1和PAT 2之間的打印線-包括PAT 1,但不包括PAT 2。

以下只是范圍的開(kāi)始:

GNUsed

sed -n '/PAT1/,/PAT2/{/PAT2/!p}' FILE

任何sed

sed -n '/PAT1/,/PAT2/{/PAT2/!p;}' FILE

在pat 1和pat 2之間的打印線-包括pat 2,但不包括pat 1。

以下內(nèi)容僅包括范圍結(jié)束:

GNUsed

sed -n '/PAT1/,/PAT2/{/PAT1/!p}' FILE

任何sed

sed -n '/PAT1/,/PAT2/{/PAT1/!p;}' FILE

1關(guān)于BSD/MacOSXsed的注意事項(xiàng)

這里有這樣的命令:

sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p}}' FILE

會(huì)發(fā)出錯(cuò)誤:

? sed -n '/PAT1/,/PAT2/{/PAT1/!{/PAT2/!p}}' FILE
sed: 1: "/PAT1/,/PAT2/{/PAT1/!{/ ...": extra characters at the end of p command

由于這個(gè)原因,這個(gè)答案已經(jīng)被編輯,包括BSD和GNU版本的一行。


查看完整回答
反對(duì) 回復(fù) 2019-06-03
?
蕭十郎

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊

使用grep與PCRE(如有)打印標(biāo)記和標(biāo)記之間的線條:

$ grep -Pzo "(?s)(PAT1(.*?)(PAT2|\Z))" file
PAT13    - first block4PAT2
PAT17    - second block
PAT2
PAT110    - third block
  • -P

    perl-regexp,PCRE.一點(diǎn)也不

    grep

    變體
  • -z

    將輸入視為一組行,每一行以零字節(jié)結(jié)尾,而不是換行符。
  • -o

    只打印匹配
  • (?s)

    都是.點(diǎn)也能找到新行。
  • (.*?)

    非貪婪發(fā)現(xiàn)
  • \Z

    只匹配字符串的末尾,或換行符后面的換行符。

標(biāo)記之間的打印行(不包括結(jié)束標(biāo)記):

$ grep -Pzo "(?s)(PAT1(.*?)(?=(\nPAT2|\Z)))" file
PAT13    - first block4PAT17    - second block
PAT110    - third block
  • (.*?)(?=(\nPAT2|\Z))

    非貪婪查找

    \nPAT2

    \Z

除標(biāo)記外的標(biāo)記之間的打印行:

$ grep -Pzo "(?s)((?<=PAT1\n)(.*?)(?=(\nPAT2|\Z)))" file3    - first block47    - second block10    - third block
  • (?<=PAT1\n)

    積極尋找

    PAT1\n

標(biāo)記之間的打印行(不包括開(kāi)始標(biāo)記):

$ grep -Pzo "(?s)((?<=PAT1\n)(.*?)(PAT2|\Z))" file3    - first block4PAT27    - second block
PAT210    - third block


查看完整回答
反對(duì) 回復(fù) 2019-06-03
  • 3 回答
  • 0 關(guān)注
  • 654 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)