vim技巧--提取文本與文本替換

来源:https://www.cnblogs.com/xiaoguoic/p/18064396
-Advertisement-
Play Games

前幾天遇到一個使用情景,需要從一個包含各個讀取代碼文件路徑及名字的文件中把文件路徑提取出來,做一個filelist,這裡用到了文本的提取和替換,這裡做個小總結記錄一下。 從網上找了一個作者寫的代碼用來練習。 module asyn_fifo #( //parameter declaration pa ...


前幾天遇到一個使用情景,需要從一個包含各個讀取代碼文件路徑及名字的文件中把文件路徑提取出來,做一個filelist,這裡用到了文本的提取和替換,這裡做個小總結記錄一下。
從網上找了一個作者寫的代碼用來練習。

module asyn_fifo #(
//parameter declaration
parameter ADDR_WIDTH     		=	4	,
parameter DATA_WIDTH	    		=	16	,
parameter ALMOST_FULL_GAP               =	3	,//將滿,離滿還有ALMOST_FULL_GAP時,almost_full有效
parameter ALMOST_EMPTY_GAP              = 	3	,//將空,離空還有ALMOST_EMPTY_GAP時,almost_empty有效
parameter FIFO_DEEP                     =       16     
)
(
	//fifo write
	wr_clk		,
	wr_en		,
	almost_full ,
	full		,
	wr_data		,
	//fifo read
	rd_clk		,
	rd_en		,
	almost_empty,
	empty		,
	rd_data		,
	wr_reset	,
	rd_reset	
);
1)先思考寫時鐘方向,首先是寫請求,在不滿且寫使能有效拉高寫請求.

assign wen = wr_en && (!full)
2)其次是寫地址,

always @(posedge wr_clk or negedge wr_reset)
	if(!wr_reset)
		waddr <= {(ADDR_WIDTH+1){1'b0}};
	else if(wen)
		waddr <= waddr + 1'b1;
	else
		waddr  <= waddr;
3)將寫地址轉換為格雷碼

always @(posedge wr_clk or negedge wr_reset)
	if(!wr_reset)
		waddr_gray <= {(ADDR_WIDTH + 1){1'b0}};
	else
		waddr_gray<= waddr^(waddr>>1);
4)將讀格雷碼轉換到寫時鐘域,準備計算將滿和滿信號了

always @(posedge wr_clk or negedge wr_reset)
	if(!wr_reset) begin
		raddr_gray_sync 	<= {(ADDR_WIDTH+1){1'b0}};
		raddr_gray_sync_d1  <= {(ADDR_WIDTH+1){1'b0}};
	end
	else begin
		raddr_gray_sync 	<= raddr_gray;
		raddr_gray_sync_d1  <= raddr_gray_sync;
	end
5)將讀格雷碼轉換為二進位(這樣有利於將滿信號和FIFO usdws(used words,使用了多少字)的計算)

integer i;
always @(*)
begin
    for(i=0;i<ADDR_WIDTH+1;i=i+1)
	raddr_gray2bin = ^(raddr_gray_sync_d1>>i);
end
6)寫地址與讀地址間隔計算,寫了多少個字了

always @(*)begin
	if(raddr_gray2bin[ADDR_WIDTH] ^ waddr[ADDR_WIDTH])//二進位擴展位為迴圈指示位
		wr_gap = raddr_gray2bin[ADDR_WIDTH-1:0] - waddr[ADDR_WIDTH-1:0];
	else
		wr_gap = FIFO_DEEP + raddr_gray2bin - waddr;
end
7)almost full信號產生

 always @(posedge wr_clk or negedge wr_reset)begin
	if(!wr_reset)
		almost_full <= 1'b0;
	else begin
		if(wr_gap < ALMOST_FULL_GAP)
			almost_full <= 1'b1;
		else
			almost_full <= 1'b0;
	end
end
8)full信號產生

always @(posedge wr_clk or negedge wr_reset)begin
	if(!wr_reset)
		full <= 1'b0;
	else
		full <= (wr_gap==1)&&wen;
9)再來寫讀時鐘方向,其實與寫時鐘方向堆成,首先是讀請求,

assign ren = rd_en &&(!empty);
10)FIFO讀地址的產生

always @(posedge rd_clk or negedge rd_reset)
	if(!rd_reset)
		raddr <= {(ADDR_WIDTH+1){1'b0}};
	else if(ren)
		raddr <= raddr + 1'b1;
        else
                raddr <= raddr;
11)讀地址轉變為讀格雷碼

always @(posedge rd_clk or negedge rd_reset)
	if(!rd_reset)
		raddr_gray <= {(ADDR_WIDTH + 1){1'b0}};
	else
		raddr_gray <= raddr^(raddr>>1);
12)寫地址同步到讀時鐘域

always @(posedge rd_clk or negedge rd_reset)begin
	if(!rd_reset) begin
		waddr_gray_sync 	<= {(ADDR_WIDTH+1){1'b0}};
		waddr_gray_sync_d1  <= {(ADDR_WIDTH+1){1'b0}};
	end
	else begin
		waddr_gray_sync 	<= waddr_gray;
		waddr_gray_sync_d1  <= waddr_gray_sync;
	end
end
13)寫地址格雷碼變成二進位,便於讀格子的計算

integer j;
always @(*)begin
for(j=0;j<ADDR_WIDTH+1;j=j+1)
	waddr_gray2bin = ^(waddr_gray_sync_d1>>i);
end
14)讀格子的計算—即還有多少數據未讀

always @(*)
	rd_gap = waddr_gray2bin - raddr;
15)almost_empty信號產生

always @(posedge rd_clk or negedge rd_reset)begin
	if(!rd_reset)
		almost_empty <= 1'b1;
	else begin
		if(rd_gap < ALMOST_EMPTY_GAP)
			almost_empty <= 1'b1;
		else
			almost_empty <= 1'b0;
	end
end
16)產生empty信號

always @(posedge rd_clk or negedge rd_reset)begin
	if(rd_reset)
		empty <= 1'b1;//複位了FIFO為空
	else
		empty <= (rd_gap == 1) & rd_en;
end
17)例化雙口RAM,在寫請求有效時將數據存放到裡面,併在讀請求有效時讀出數據。

ram  ram_inst#(
  parameter RAM_WIDTH = 4
)(
  .wr_clk(wr_clk),
  .addra(wr_addr),
  .dina(wr_data),
  .wra(wen),
///////
  .rd_clk(rd_clk),
  .addrb(rd_addr),
  .dina(rd_data),
  .rdb(ren)
);
練習1-將作者寫的步驟文字,即x)開頭的文字提取出來

使用v/pattern/d來實現,這個命令的意思是將匹配pattern的行提取出來,其中pattern就是你定義的匹配模式,如下圖所示。其中^代表匹配行首,\d代表匹配一個數字,這樣我們就完成了提取。那如果我想刪除掉這些而只保留代碼呢?

:v/^\d/d

我們使用g/pattern/d來實現,這個命令的意思是將匹配pattern的行刪除而保留其他。

:g/^\d/d

以此類推,重點是會寫pattern,這裡有個作者已經總結的很好了,可以參考這個作者的總結,已經總結很全了。 https://blog.csdn.net/lazyclough/article/details/6193398

練習3-獲取該模塊的信號列表(先提取再替換)

第一步:
可以看出信號列表都是以,結尾,除了最後一個,所以可以先複製最後一個信號,然後使用如下命令開始提取。

:v/.*,/d

其中.*分別代表任意字元,任意多個,“,”就是匹配“,”,得到瞭如下代碼。

第二步:
可以看到,還有些以“.”開頭的和以“parameter”開頭的我們不需要,所以可以使用如下命令去除(這個時候代碼已經很少了其實可以用“ndd”刪除n行,或者滑鼠選中按“d”的方法來操作了,但這裡是為了做練習,所以不用它們):

:g/^\s\s\./d

其中^匹配行首,\s\s匹配兩個空格,也可以用\s{2},{2}代表匹配兩次,.匹配“.”,然後代碼如下。

然後輸入命令

:g/parameter/d

得到如下代碼

第三步:
然後我們需要將“,”全部去除,使用替換命令:range s/pattern/new string/command(其實這列逗號排列是整齊的,可以用列操作很方便的刪除,但是我們為了練習)。

:%s/,//g

其中range的%代表全局匹配替換,也可以用行號來指定匹配替換的範圍,g代表匹配到的全部替換,gc代表全部替換但是每次替換前要詢問。得到的代碼如下:

到這裡基本就完成了,採用列操作或者上述辦法去除掉開頭的空格,再把之前複製的最後一個信號複製上去就完成任務。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過引入分散式冪等性框架,可以有效處理分散式系統中的重覆操作問題,確保系統穩定運行並保持數據的一致性。 ...
  • 前言 雖然已經正式轉JAVA了,但最近發現一個特別好的開源項目masuit,不僅提供很多簡便的功能,還有圖像的一些特殊操作功能。 之前我們比較圖片應該都是使用的openCV,不過這個masuit,看上去也不錯,而且代碼使用簡單,因此強烈推薦。 下麵就實現一個簡單圖像對比。 實現對比 首先添加引用ma ...
  • 前一段時間我用 WPF 開發了一個查看 emoji 表情的小工具 https://github.com/he55/EmojiViewer ,由於最近我使用 macOS 系統比較多,我想能在 macOS 系統上也能使用這個工具。於是我嘗試將 WPF 應用遷移到 Electron 框架,感覺這個框架很強 ...
  • node-exporter常用監控指標 CPU相關指標: node_cpu_seconds_total{mode="idle"}:CPU空閑時間(秒)的總和。這是評估CPU使用率的重要指標之一。 node_cpu_seconds_total{mode="system"}、node_cpu_secon ...
  • STM32標準庫定時器輸入捕獲 1.輸入捕獲介紹 輸入捕獲為STM32定時器的一個功能,可以用來測量輸入信號的頻率和占空比。 具體原理:當輸入信號經過比較捕獲通道時,STM32會依據通道的極性設置決定是否觸發捕獲中斷TIM_IT_CCx。此時定時器會將當前計數值TIMx->CNT的值保存在TIMx- ...
  • 如題,在使用Pyinstaller庫打包過程中,如果遇到IndexError:tuple index out of range,不必驚慌,本質上是庫函數在傳參過程中出現異常 下麵是解決方案: 找到..\envs\steamlit\lib\dis.py這個文件。 如果你是用的虛擬環境,比如conda, ...
  • 1. 查看防火牆狀態:active (running) 即是開啟狀態 systemctl status firewalld 2. 如果不是顯示 active 狀態,需要打開防火牆 # 啟動 systemctl start firewalld # 查看狀態 systemctl status firew ...
  • 1、準備材料 正點原子stm32f407探索者開發板V2.4 STM32CubeMX軟體(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP模擬器 2、學習目標 瞭解 FreeRTOS 相關知識,並熟悉使用 STM32CubeMX 軟體配置 FreeRT ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...