首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何找到第n个字符串的行号,打印并存储到makefile中的一个变量中?

要在Makefile中找到第n个字符串的行号并打印存储到一个变量中,可以使用以下步骤:

基础概念

  1. Makefile: 是一个构建自动化工具,用于自动化编译、链接等任务。
  2. Shell命令: 可以在Makefile中使用shell命令来执行各种操作。
  3. 变量: 在Makefile中可以定义和使用变量来存储数据。

相关优势

  • 自动化: 通过Makefile可以自动化重复的任务,提高开发效率。
  • 可维护性: 将构建过程脚本化,便于管理和维护。
  • 灵活性: 可以根据不同的需求定制构建流程。

类型与应用场景

  • 文本处理: 适用于需要对文本文件进行处理的场景,如查找特定内容、替换文本等。
  • 构建系统: 在软件开发中,常用于管理项目的构建过程。

示例代码

假设我们有一个文本文件 data.txt,内容如下:

代码语言:txt
复制
apple
banana
cherry
date
elderberry
fig
grape

我们希望找到第3个字符串(即 "cherry")的行号,并将其存储到Makefile中的一个变量中。

Makefile 示例

代码语言:txt
复制
# 定义文件名和目标行号
FILE = data.txt
N = 3

# 使用shell命令找到第n个字符串的行号
LINE_NUMBER := $(shell awk 'NR==$(N){print NR}' $(FILE))

# 打印行号
print-line:
    @echo "The line number of the $(N)th string is: $(LINE_NUMBER)"

# 存储到变量中
STORE_LINE:
    @echo "LINE_NUMBER=$(LINE_NUMBER)" > line_number.txt

解释

  1. 定义变量:
    • FILE 是包含字符串的文件名。
    • N 是目标字符串的行号。
  • 使用 awk 命令:
    • awk 'NR==$(N){print NR}' $(FILE) 会找到第 N 行并打印其行号。
    • NRawk 中的内置变量,表示当前处理的行号。
  • 打印行号:
    • print-line 目标会执行 echo 命令,打印找到的行号。
  • 存储到变量中:
    • STORE_LINE 目标会将行号写入 line_number.txt 文件。

运行示例

在终端中运行以下命令:

代码语言:txt
复制
make print-line
make STORE_LINE
  • 第一条命令会打印第3个字符串的行号。
  • 第二条命令会将行号存储到 line_number.txt 文件中。

可能遇到的问题及解决方法

  1. 文件不存在:
    • 如果文件不存在,awk 命令会报错。
    • 解决方法:在执行命令前检查文件是否存在。
    • 解决方法:在执行命令前检查文件是否存在。
  • 行号超出范围:
    • 如果指定的行号 N 超出文件的实际行数,awk 不会输出任何内容。
    • 解决方法:在执行命令后检查变量是否为空。
    • 解决方法:在执行命令后检查变量是否为空。

通过以上步骤和示例代码,可以在Makefile中有效地找到第n个字符串的行号并进行相应的处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一个变量在内存中是如何存储的

我们自学习一门高级语言时,都要了解数据成分,可你们知道在高级语言中数据都是如何在内存中存储的吗?今天我就来介绍一下。...语言:C++ int c=-123; 这只是一个简单的定义了一个变量,变量名为c,值为-123。 然而我们大家应该都知道,计算机存储数据都会以二进制的形式来存储。...首先-13加12肯定是-1,因为有负号,所以是一个有符号int型的数值。 所以就要求出这个数的补码,我上面说过,有符号数,在内存中存储的都是补码。...由于我们test2是一个无符号的int型变量,所以他就把这个32个1直接转为了10进制,也就是 ? 看到这里,我相信大家应该明白了变量是如何在内存中表示的,以及有符号和无符号变量的区别了吧。...注意:只有当数值为负数时,在内存中才会存补码形式。 比如:int i=124; 虽然我定义的一个有符号型的int变量,但是由于i是一个正数,所以在内存中的存储形式为原码: ?

2.8K40

Linux学习-开发工具的使用

n个位置 按[gg]:光标移到文本开始 按[shift+g]:光标移到文本末端 按[n+shift+g]:光标移到文本第n行 删除文字: 「x」:每按一次,删除光标所在位置的一个字符 「n+x」:删除光标所在位置的...n行 //注意:dd与“p”配能完成剪切粘贴功能 复制: 「yw」:将光标所在之处到字尾的字符复制到缓冲区中 「n+yw」:复制n个字到缓冲区 「yy」:复制光标所在行到缓冲区 「n+yy」:表示拷贝从光标所在的该行...「set nonu」后会取消文件中 的行号 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了 查找字符: 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的...示图: 五、Linux项目自动化构建工具-make/Makefile 1、背景及概念 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定...对应的是目标文件; ^:表示依赖文件列表 执行过程/原理: 在默认的方式下只输入make命令,则会在当前目录下找名字叫“Makefile”或“makefile”的文件 如果找到,它会找文件中的第一个目标文件

3.4K20
  • Linux基础操作

    grep 在文件中查找字符串,并打印出来。 zip/unzip 打包,压缩,解压缩。 -r:递归式压缩,把目录以及子目录一并处理。 tar 打包,压缩,解压。...dd:剪贴,ndd从当前行到n行剪贴。 p:粘贴,np粘贴多少次。 u:撤销。 Shift g:光标定位到文件结尾。 gg:文件最开始的地方。 n Shift g:文件的第n行的开始。...l 行号:从行号处开始列,每次列10行。 b 行号:设置断点。 info b:查看断点。 d 断点编号:取消断点 r:运行,遇到断点停止。 c:运行到下一个断点处停下来。 n:逐过程 s:逐语句。...p 变量名:打印变量的信息 bt:调用堆栈。 finish:把当前函数运行结束停下来。...自动化的进行程序的编译链接,make会在当前文件中查找makefile或者Makefile。

    48420

    Linux环境基础开发工具

    「n + yw」: 复制 ==n 个完整的字符串==到缓冲区 替换;更改;切换大小写 「shift + ~」: 将光标处的大小写互相切换 「r」: 替换光标所在处的字符。...跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。...: 打印表达式的值,通过表达式可以修改变量的值或者调用函数 display 变量名: 跟踪查看一个变量,每次停下来都显示它的值,==相当于vs中的监视==* undisplay 变量名: 取消对先前设置的那些变量的跟踪...如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到 “mytmp” 这个文件,并把这个文件作为最终的目标文件。...Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释 显式规则说明了,如何生成一个或多个目标文件。

    1.9K50

    Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试

    3.4 Makefile 中的变量 为了减少重复,Makefile 支持变量定义和引用。...$(patsubst %.c, %.o, $(SRC)) 将变量 SRC 中的所有 .c 替换为 .o。 $(shell 命令) 执行 shell 命令并将输出存储到变量中。...n(next):逐过程,单条执行,当有函数调用时,不会进入函数内部。 我们接着上面的代码走。 s(step):逐语句,进入函数调用。 p 变量:打印变量的值。...注意:通过p来打印变量的值,不会根据我们调试的进行而实时变化。 display 变量名:跟踪查看一个变量,每次停下来都显示它的值,类似于Visual Studio中的监视窗口。...注意:finish指令可以快速的帮我们查看问题是不是出在当前函数中。 c(continue):从当前断点直接运行到下一个断点处。

    19910

    【Linux入门】2w字详解yum、vim、gccg++、gdb、makefile以及进度条小程序

    n + yw:复制 n 个完整的字符串到缓冲区 替换、更改、切换大小写: shift + ~:将光标处的大小写互相切换 r:替换光标所在处的字符。 n + r:替换光标所在处的 n 个字符。...跳到文件中的某一行: #:这个符号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字 15,再回车,就会跳到文章的第 15 行。...: 启用断点 p + 变量或表达式(print):打印表达式的值,通过表达式可以修改变量的值或者调用函数 display 变量名:跟踪查看一个变量,每次停下来都显示它的值,相当于vs中的监视...如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到 mytmp 这个文件,并把这个文件作为最终的目标文件。...Makefile 里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释 显式规则说明了,如何生成一个或多个目标文件。

    13310

    【Linux】Linux开发工具-vim 编译器-gccg++ 调试器-gdb git操作 项目自动化构建工具-makeMakefile

    finish:执行到当前函数返回,然后挺下来等待命令 print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数 p 变量:打印变量值。...p 变量:打印变量值 11. display 变量名:跟踪查看一个变量 每次停下来都显示它的值 12. undisplay:取消对先前设置的变量的跟踪 13. until X行号:跳至X行 4.3 理解...背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译...那么, make会在当前目录下找名字叫“Makefile”或“makefile”的文件 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件...hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件(这有点像一个堆栈的过程) 当然,你的C文件和H

    10210

    Linux Shell工具篇 - 文本分析工具awk

    介绍 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时显得尤为强大。...选项参数说明: 选项参数 功能 -F 指定输入文件拆分分隔符 -v 赋值一个用户定义变量 awk内置变量 内置变量 含义 ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用...$1表示当前行的第一个域,$2表示当前行的第二个域,……以此类推。...文件有root关键字的所有行,然后以”:”拆分并打印输出第7列: awk -F: '/root/{print $7}' passwd # -F: 以':'分隔符拆分每一个列(域)数据 运行效果 4....NF-N) N是几, 就是倒数第几列 运行效果 10.打印10到20行的第一列 获取第10到20行的第一列的信息: awk -F: '{if(NR>=10 && NR<=20) print $1}'

    1.7K20

    第009课 gcc和arm-linux-gcc和Makefile

    &变量: 目的:获得变量在内存中的地址; 返回:变量在内存中起始地址; 第004节c语言指针复习2指向数组和字符串的指针 实例2 我们在pointer_test.c的文件中写一个test2()函数,...3个元素的字符数组ca(数组名表示该数组存储的首地址),然后定义一个字符指针pc,然后通过printf()函数把定义这两个变量在内存中的地址打印出来。...3个元素的整型数组ia数组名表示该数组存储的首地址),初始化值分别为,0x12345678, 0x87654321, 0x13572468, 然后定义一个整型指针pi,然后通过printf()函数把定义这两个变量在内存中的地址打印出来...,我们打印一下变量的存储地址*/ printf("&pc =%p\n",&pc); /*第二步:所有变量都可以保存某些值,接着赋值并打印*/ //前面已经有pc="abc";...我们直接执行make的时候,会在makefile里面找到第一个目标然后执行下面的指令生成第一个目标。

    4.9K30

    gdb和makefile的讲解

    list 打印行号 list 将所有内容和行号一起打印 2.2 run运行程序 r(run) 运行程序 遇到断点停止 2.3 执行语句 n 或 next:单条执行 对应vs里的f10 s或...:禁用断点 enable breakpoints:启用断点 例如: 2.5 跟踪变量 display 变量名:跟踪查看一个变量,每次停下来都显示它的值 undisplay:取消对先前设置的那些变量的跟踪...makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译...如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test3”这个文件, 并把这个文件作为最终的目标文件。 3....如果test3所依赖的文件不存在,那么make会在当前文件中找目标为test3.c文件的依赖性,如果找到则再根据那一个规则生成test3.c文件。(这有点像一个堆栈的过程) 5.

    15010

    6_Makefile与GCC

    当gcc在默认的路径中没有找到头文件时,就到本选项指定的目录中去找。在上面的例子中创建一个目录,然后创建一个头文件test.h。...一个错误是指第10行prntf之前缺少分号。两个警告是指第7行和第8行的变量没有使用。...6.4.2 Makefile的引入 ​ Makefile的引入是为了简化我们编译流程,提高我们的开发进度。下面我们用一个例子来说明Makefile如何简化我们的编译流程。...第二行我们定义了变量OBJ,并赋值字符串”main.o,add.o,sub.o“。其中第三,四,十三行,使用这个变量。这样用到用一个字符串的地方直接调用这个变量,无需重复写一大段字符串。 ​...6.5.2.4 赋值符‘+=’ ​ Makefile 中的变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进去,此时就要使用到符号“+=”,比如如下: 01 OBJ = main.o add.o

    3.6K10

    Linux 下的make命令与Makefile

    其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。 当前,我们也可以给make命令指定一个特殊名字的Makefile。...) 我们可以注意到,这个Makefile中并没有写下如何生成hello.o和kitty.o这两目标的规则和命令。...这些奇怪的变量我们叫“自动化变量”,后面会详细讲述。 自动化变量 在上述的模式规则中,目标和依赖文件都是一系列的文件,那么我们如何书写一个命令来完成从不同的依赖文件生成相应的目标?...在上述所列出来的自动量变量中。四个变量(@ 、一个文件,而另三个的值是一个文件列表。...如果经过第5步,没有模式规则被找到,那么就做更进一步的搜索。对于存在于列表中的第一个模式规则: (a) 如果规则是终止规则,那就忽略它,继续下一条模式规则。 (b) 计算依赖文件。

    10.2K20

    Linux-基础开发工具

    复制 【yw】把光标所在之处到字尾的字符复制到缓冲区中 【#yw】复制#个字符到缓冲区 【yy】复制光标所在行到缓冲区 【#yy】复制光标及其下面共#个行的复制 【p】粘贴 替换...【sert nu】 跳转某一行 【#】 到第#行 查找字符 【/】 先按【/】再按你想寻找的字符,可以按【n】向后查找 【?】...,在运行的时候链接成一个整体 动态链接更常用一些 ldd可以打印程序或者库文件所依赖的共享库列表 库 系统把函数实现的头文件和源文件放在了特殊的地方,如果没有指定头文件的位置...makefile带来的好处就是 自动化编译,仅需make命令,整个工程都会自动编译,提高了软件开发的效率 make是命名,makefile是一个文件...print/p 表达式 打印表达式的值 p 变量 打印变量的值 set var 变量 = 值

    4700

    sed、awk——运维必须掌握的两个工具

    通常跟参数-n 一起运行 s:替换,用一个字符串替换另一个,注意与c参数的区别 3.举例 我们用/ etc/passwd文件来演示,先来看看sed不加参数跟加上-n参数是怎样的 ? ?...删除第1行,第10行,留意行号变化 ? 将passwd文件中包含/sbin/nologin替换为/bin/bash并打印输出 ?...将passwd文件中第2行的数据替换为test,注意到与s参数的区别了吧 ? 在passwd文件第二行新增test字符串 ? 在passwd文件第二行插入test字符串 ?...打印passwd每一行的数据,并以:为分隔符计算每行的字符总数打印在每行数据的末尾 ? 打印passwd文件中以:为分隔符第三个字段即UID>=500的数据所在行号 ?...想想日常工作中如何要获取文件中第几行第几列的数据应该如何操作,如打印passwd文件中第一行与最后一行第一列的数据,sed跟awk结合使用啦。 ?

    94860

    shell脚本扩展「建议收藏」

    ^[A-Z]..$ 搜索行以A至Z的一个字母开头,然后跟两个任意字母,然后跟一个换行符的行。将找到第5行。...将找到第4行的TOM(整行匹配)和第5行。注意,*前面有一个空格。...,填充域,0则表示所有域,1表示第一个域, 思考题:如何打印所有记录(以/etc/passwd中的内容为例) 例4:搜索/etc/passwd有root关键字的所有行 这种是pattern(模式)的使用示例...) 例6:统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容: 显示所有账户的记录,并带有其记录号,并在END部分打印输入文件名 除了awk的内置变量,awk还可以自定义变量...如果相应的文件长度大于BLOCK_LIMIT变量所规定的值,那么该文件将被拷贝到一个文件 名含有时间戳的文件中,原先的文件长度将被截断为0。

    5.8K20

    Linux文本处理详细教程

    -type f -user root -exec chown weber {} \; 注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名; 将找到的文件全都copy到另一个目录...filename -d 指定定界符 cat -f2 -d";" filename cut 取的范围 N- 第N个字段到结尾-M 第1个字段为MN-M N到M个字段 cut 取的单位...-b 以字节为单位-c 以字符为单位-f 以字段为单位(使用定界符) 示例: cut -c1-5 file //打印第一到5个字符 cut -c-2 file //打印前2个字符 截取文本的第5...: NR NF $0 $1 $2 NR:表示记录数量,在执行过程中对应当前行号; NF:表示字段数量,在执行过程总对应当前行的字段数; $0:这个变量包含执行过程中当前行的文本内容; $1:第一个字段的文本内容...迭代每一个字符 ${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片) ${#word}:返回变量word的长度 for((i=0;i<${#word

    4.4K20

    sed 命令+正则表达式

    sed是一个非交互性性文本编辑器, 它编辑文件或标准输入导出的文件拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道文件。...sed必须通过行号和正则表达式指定要改变的文本行 sed怎样读取数据:     sed从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它...        y  传送字符     n      从另一个文本中读文本下一行,并附加在下一行   {}     在定位行执行的命令组     g      将模式2粘贴到/pattern n/ 基本...打印第1行到第3行     打印模式:  sed -n '/movie/'p temp.txt     打印含movie的行     使用模式和行号查询:  sed -n '3,/movie/'p temp.txt...   只在第3行查找movie并打印     显示整个文件:  sed -n '1,$'p temp.txt      $为最后一行     任意字符:  sed -n '/.

    3.4K20

    Linux探秘坊-------6.gdb

    有的,兄弟有的: 在我们之前自己编写的makefile文件中:加入-g 这样make出来的可执行程序就满足进行调试的要求哩 2.认识gdb 先创建一个mycode.c 用vim写入:区间求和小程序 #...删除断点 info b 显示没有断点了 run 运行程序(有断点就停下来) l + 文件名:行号 2.逐语句和逐过程 当前我设置了一个断点,可以看到断点行有一个函数。 走函数还是不走函数呢?...-------------------打印变量名的值 disable + 断点编号---------使断点无效但不删除断点,(可见断点处变黄) enable + 断点编号 --------------使断点复原...4.c,until ,display,undisplay c -------------从一个断点跳到另一个断点 until + 行号n----------从 当前行 直接执行到 第n行 display...var+变量= … ————————仅在调试过程中改变变量的值,但退出gdb后值不改变 这里用 p 查出原来result值为5050,使用 set var result =1,改变了result的值,

    6000
    领券