簡體   English   中英

使用sed / awk命令找到模式后,修改文本文件的內容

[英]Modify the contents of a text file after a pattern has been found using sed/awk commands

我試圖提出一個Tcl腳本,但是我正在sed / awk命令中尋找一些東西來使它更快。

該文件包含以下內容:

*Other text*
.....
.....
.....
SECTION LABELS {
lab M1 0 0 0 0 3 1 bot
lab M2 0 0 0 0 3 1 top
} SECTION LABELS

*Other text*
......
......
......
SECTION LABELS {
lab M1:NET 5207 12261 5207 12261 0 2 A
lab M2:NET 6880 5370 6880 5370 0 2 B
lab M1:NET 3454 5386 3454 5386 0 2 alpha
lab M2:NET 3454 5386 3454 5386 0 2 beta
} SECTION LABELS

我只對“ SECTION LABELS”中包含的行感興趣。 我想:

  • 將M1:NET更改為M1,將M2:NET更改為M2
  • 如果最后一個元素是A或B,則將A或B之前的數字從2更改為3
  • 如果最后一個元素是其他任何元素,請將數字(最后一個,但一個除外)從2更改為6
  • 如果實驗室M1:NET或實驗室M1之后的數字為0 0 0 0,那么我不想更改任何內容。
  • 文件的其余內容保持不變

所以輸出看起來像:

*Other text*
.....
.....
.....
SECTION LABELS {
lab M1 0 0 0 0 3 1 bot
lab M2 0 0 0 0 3 1 top
} SECTION LABELS

*Other text*
......
......
......
SECTION LABELS {
lab M1 5207 12261 5207 12261 0 3 A
lab M2 6880 5370 6880 5370 0 3 B
lab M1 3454 5386 3454 5386 0 6 alpha
lab M2 3454 5386 3454 5386 0 6 beta
} SECTION LABELS

以下是一些入門指南:

awk '/SECTION LABELS/ {f=!f} f && /NET/ && !/lab M1(:NET)* 0 0 0 0/ {split($2,a,":");$2=a[1];if ($NF~/\<[A|B]\>/) $(NF-1)=3; else $(NF-1)=6}1' t
*Other text*
.....
.....
.....
SECTION LABELS {
lab M1 0 0 0 0 3 1 bot
lab M2 0 0 0 0 3 1 top
} SECTION LABELS

*Other text*
......
......
......
SECTION LABELS {
lab M1 5207 12261 5207 12261 0 3 A
lab M2 6880 5370 6880 5370 0 3 B
lab M1 3454 5386 3454 5386 0 6 alpha
lab M2 3454 5386 3454 5386 0 6 beta
} SECTION LABELS

您可以將范圍用作模式,然后對介於兩者之間(包括兩端)的文本進行操作。 供您輸入:

awk '/^SECTION LABELS {/,/} SECTION LABELS/{
    sub(":NET","")
    if ($8 && !/M1 0 0 0 0/) $8 = ($NF ~ /^[AB]$/) ? 3 : 6 
}1' file.txt

注意:(1)如果“ SECTION LABELS”中的單詞超過7個,則需要調整“ if”部分(我想這只是一個示例)。 您可以將'$ 8'更改為'$ 9'或$ 9!=“”等,以跳過標題和尾部。

(2)如果A,B是字符串而不是字符,則需要將正則表達式從^ [AB] $更改為^(A | B)$

(3)如果還想保持M2 0 0 0 0不變,則將!/ M1 0 0 0 0 /更改為!/ \\ <0 0 0 0 \\> /,其中'\\ <'和'\\>'為正則表達式中的單詞邊界。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM