vim技巧--提取文本与文本替换

这篇具有很好参考价值的文章主要介绍了vim技巧--提取文本与文本替换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前几天遇到一个使用情景,需要从一个包含各个读取代码文件路径及名字的文件中把文件路径提取出来,做一个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

vim技巧--提取文本与文本替换

我们使用g/pattern/d来实现,这个命令的意思是将匹配pattern的行删除而保留其他。

:g/^\d/d

vim技巧--提取文本与文本替换

以此类推,重点是会写pattern,这里有个作者已经总结的很好了,可以参考这个作者的总结,已经总结很全了。 https://blog.csdn.net/lazyclough/article/details/6193398

练习3-获取该模块的信号列表(先提取再替换)

第一步:
可以看出信号列表都是以,结尾,除了最后一个,所以可以先复制最后一个信号,然后使用如下命令开始提取。

:v/.*,/d

其中.*分别代表任意字符,任意多个,“,”就是匹配“,”,得到了如下代码。
vim技巧--提取文本与文本替换

第二步:
可以看到,还有些以“.”开头的和以“parameter”开头的我们不需要,所以可以使用如下命令去除(这个时候代码已经很少了其实可以用“ndd”删除n行,或者鼠标选中按“d”的方法来操作了,但这里是为了做练习,所以不用它们):

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

其中^匹配行首,\s\s匹配两个空格,也可以用\s{2},{2}代表匹配两次,.匹配“.”,然后代码如下。
vim技巧--提取文本与文本替换

然后输入命令

:g/parameter/d

得到如下代码
vim技巧--提取文本与文本替换

第三步:
然后我们需要将“,”全部去除,使用替换命令:range s/pattern/new string/command(其实这列逗号排列是整齐的,可以用列操作很方便的删除,但是我们为了练习)。

:%s/,//g

其中range的%代表全局匹配替换,也可以用行号来指定匹配替换的范围,g代表匹配到的全部替换,gc代表全部替换但是每次替换前要询问。得到的代码如下:
vim技巧--提取文本与文本替换
到这里基本就完成了,采用列操作或者上述办法去除掉开头的空格,再把之前复制的最后一个信号复制上去就完成任务。文章来源地址https://www.toymoban.com/news/detail-838511.html

到了这里,关于vim技巧--提取文本与文本替换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 文本预处理技巧:去除停用词、词形还原、词干提取等

    文本预处理是自然语言处理中非常重要的一步,它是为了使得文本数据能够被机器学习模型所处理而进行的一系列操作。其中,去除停用词、词形还原、词干提取等技巧是比较常用的。本文将介绍这些技巧的原理,并提供使用Python实现的代码示例,帮助读者更好地理解和实践

    2024年02月05日
    浏览(38)
  • 探索 Vim:一个强大的文本编辑器

    引言: Vim(Vi IMproved)是一款备受推崇的文本编辑器,拥有强大的功能和高度可定制性,提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。 1. Vim 的简介和历史 Vim(Vi Improved)是一个备受欢迎的文本编辑器,它是 Vi 编辑器的改进

    2024年02月04日
    浏览(50)
  • 【正点原子STM32】KEIL MDK5使用技巧(文本美化、代码编辑、查找&替换技巧、工程编译问题定位、窗口视图管理)

    一、文本美化 1.1、编辑器设置 1.2、字体和颜色设置 1.3、用户设置 1.4、代码提示语法检测 1.5、global.prop文件妙用 二、代码编辑技巧 2.1、Tab键的妙用 2.2、快速定位函数或变量被定义的地方 2.3、快速注释快速取消注释 三、查找替换技巧 3.1、快速打开头文件 3.2、查找功

    2024年01月23日
    浏览(68)
  • vim 替换命令 “:s“

    命令 :s/old/new 【注意】 光标所在行; 第一个匹配项。 命令 :s/old/new/g 【注意】 和上一个命令的注意事项一样; 和上一个命令的差别在于最后的 ‘/g’ 。 命令 :#,#s/old/new 其中 #,# 代表行号 比如,下面的指令把从第 5 行开始到第 99 行的第一个 the 替换为 The ,包括第 5 行,也

    2024年02月10日
    浏览(35)
  • MATLAB中的矩阵元素提取和替换

    MATLAB中的矩阵元素提取和替换 在MATLAB中,提取和替换矩阵元素是非常常见的任务。这项任务通常涉及到基于索引的操作,MATLAB提供了各种强大的功能来实现这些操作。在本文中,我们将探讨如何使用MATLAB提取和替换矩阵中的元素,并提供相应的源代码示例。 矩阵元素提取 要

    2024年02月07日
    浏览(36)
  • 【Linux】vim常用命令(多行注释、字符替换,命令模式、底行模式常用命令)

    为什么使用 vim 呢?因为它是所有 Linux 环境下自带的。 vi / vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 mac os、win

    2024年02月10日
    浏览(44)
  • Linux Vim文本编辑器-Vim常用命令

    距离上次Linux的学习,今天又是一个崭新的起点,我们用五天的时间学了一些Linux一些常用的操作命令,但掌握这些还是远远不够的,这个世界就是这样,将生于此,既是幸运也是不幸,只有不断地学习才能有自己的一席之地,话不多说,开始我们今天的Linux学习之旅。 目录

    2024年02月06日
    浏览(64)
  • 批处理批量替换文本内容,用bat代码全篇替换txt文本文件中指定字符信息

    批处理批量全篇替换txt文本文件中指定字符信息,修改三个参数后即可使用,话不多说直接上代码: @echo off setlocal EnableDelayedExpansion set path_str=\\\"C:UsersAdministratorDesktop1.txt\\\" set old_str=需要替换的原文本内容 set new_str=替换后的文本内容 set souerce_path=%path_str% for /f \\\"tokens=1* delims=

    2024年02月11日
    浏览(54)
  • sed 原地替换文件时遇到的趣事

    哈喽大家好,我是咸鱼 在文章《三剑客之 sed》中咸鱼向大家介绍了文本三剑客中的 sed sed 全名叫 stream editor ,流编辑器,用程序的方式来编辑文本 那么今天咸鱼打算讲一下我在用 sed 原地替换文件时遇到的趣事 有这么一个普通文件 test.txt ,内容如下: link_test.txt 是一个软链

    2024年02月06日
    浏览(45)
  • Vim文本编辑器

    目录 一、Vim文本编辑器   1.1、什么是Vim文本编辑器 1.2、Vim文本编辑器基本格式 1.3、Vim的三种模式及切换 ​二、命令模式 2.1、Vim的进入与退出 2.2、命令模式下光标跳转的快捷键 2.3、常用命令集合 三、编辑模式 四、末行模式 Linux 系统中“一切皆文件”,因此当我们要更改

    2024年02月10日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包