首页 > 系统相关 >【Linux入门】正则表达以及sort、uniq、tr、cut命令

【Linux入门】正则表达以及sort、uniq、tr、cut命令

时间:2024-09-04 19:50:39浏览次数:14  
标签:sort 字符 cut 匹配 tr txt 排序

文章目录

正则表达

在Linux系统中,正则表达式(Regular Expressions, 简称Regex)是一种强大的文本处理工具,它允许你定义一种搜索、替换或操作文本的模式。sedawkgrep是三个非常流行的命令行工具,它们能够利用正则表达式来执行复杂的文本处理任务。

1. 正则表达式(Regular Expressions)

正则表达式是一种特殊的字符串模式,用于匹配、搜索、替换文本中的字符或字符组合。它由普通字符(如字母a到z)和特殊字符(称为“元字符”)组成。特殊字符赋予正则表达式以搜索、匹配和替换的能力。

常用的正则表达式元字符:

正则表达式的元字符是指那些在正则表达式中具有特殊意义的专用字符,它们可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

1. 基本元字符

  • .:匹配除换行符以外的任意单个字符。
  • ^:匹配输入字符串的开始位置。如果设置了多行模式(re.MULTILINE),则也匹配每一行的开始。
  • $:匹配输入字符串的结束位置。如果设置了多行模式,则也匹配每一行的结束。
  • *:匹配前面的子表达式零次或多次。
  • +:匹配前面的子表达式一次或多次。
  • ?:匹配前面的子表达式零次或一次。
  • {n}:n 是一个非负整数。匹配确定的 n 次。
  • {n,}:n 是一个非负整数。至少匹配 n 次。
  • {n,m}:n 和 m 均为非负整数,其中 n <= m。匹配至少 n 次,但不超过 m 次。

2. 字符类元字符

  • [xyz]:字符集合。匹配所包含的任意一个字符。
  • [^xyz]:负向字符集合。匹配未包含的任意字符。
  • [a-z]:字符范围。匹配指定范围内的任意字符。
  • [^a-z]:负向字符范围。匹配不在指定范围内的任意字符。

3. 特殊字符类

  • \d:匹配一个数字字符。等价于 [0-9]
  • \D:匹配一个非数字字符。等价于 [^0-9]
  • \s:匹配任何空白字符,包括空格、制表符、换页符等。
  • \S:匹配任何非空白字符。
  • \w:匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
  • \W:匹配非字母、数字、下划线。

4. 边界匹配符

  • \b:匹配一个单词边界,即字与空格间的位置。
  • \B:非单词边界匹配。

5. 控制字符和转义字符

  • \|:表示逻辑“或”的意思。
  • ():用于分组,并捕获匹配的文本。
  • \\:用作转义字符,用于匹配那些具有特殊意义的字符,如.*?等。

6. 贪婪与非贪婪模式

  • 默认情况下,正则表达式的量词(如*+?{n}{n,}{n,m})是贪婪的,即它们会尽可能多地匹配字符。
  • 要使量词变为非贪婪模式,可以在其后添加?,如*?+???{n}?{n,}?{n,m}?

示例

  • 匹配一个或多个数字:\d+
  • 匹配以"abc"开头的字符串:^abc
  • 匹配以"xyz"结尾的字符串:xyz$
  • 匹配邮箱地址(简单示例):[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}(注意:这只是一个非常基础的示例,实际匹配邮箱地址的正则表达式要复杂得多)

补充

sort命令

sort 命令是 Linux 和 Unix 系统中用于对文本文件的行进行排序的一个非常有用的工具。它可以按照字母顺序、数字顺序或根据用户自定义的规则对文本行进行排序。sort 命令提供了多种选项来定制排序过程,包括忽略大小写、按数字排序、逆序排序等。

基本用法

sort [选项] [文件...]

如果没有指定文件,sort 命令将从标准输入(stdin)读取数据。

常用选项

  • -n:按照数字大小进行排序,而不是按照字符串的字典顺序。
  • -r:逆序排序。
  • -u:去除重复行,只显示唯一的行。
  • -f:忽略大小写差异进行排序。
  • -t:指定字段分隔符,默认是空白字符(空格和制表符)。
  • -k:指定排序时考虑的字段,通常与 -t 一起使用。
  • -o:将排序结果输出到指定的文件中,而不是标准输出。

示例

  1. 基本排序
    sort file.txt
    
    这将按照字典顺序对 file.txt 中的行进行排序。
  2. 按数字排序
    sort -n numbers.txt
    
    如果 numbers.txt 包含数字,-n 选项将确保它们按照数值大小而不是字典顺序排序。
  3. 逆序排序
    sort -r file.txt
    
    这将按照字典顺序的逆序对 file.txt 中的行进行排序。
  4. 去除重复行
    sort -u file.txt
    
    这将去除 file.txt 中的重复行,只保留唯一的行。
  5. 指定字段分隔符和排序字段
    假设你有一个以逗号分隔的值(CSV)文件,并希望根据第二列进行排序:
    sort -t, -k2 file.csv
    
    这里 -t, 指定了逗号作为字段分隔符,-k2 指定了排序时考虑的字段是第二列。
  6. 将排序结果保存到文件
    sort file.txt -o sorted_file.txt
    
    这将把 file.txt 的排序结果保存到 sorted_file.txt 中。

uniq命令

uniq 命令是 Linux 和 Unix 系统中用于从输入数据(或文件)中过滤掉重复行的工具。它通常与 sort 命令结合使用,因为 uniq 只能识别和删除连续重复的行。如果文件中存在非连续重复的行,你需要先使用 sort 命令对文件内容进行排序,然后再使用 uniq 来删除重复的行。

基本用法

uniq [选项] [输入文件] [输出文件]

如果不指定输入文件,uniq 将从标准输入(stdin)读取数据。如果不指定输出文件,结果将被发送到标准输出(stdout)。

常用选项

  • -c--count:在每行前加上该行在文件中出现的次数。
  • -d--repeated:仅显示重复的行,每个重复行只显示一次。
  • -u--unique:仅显示不重复的行。
  • -i--ignore-case:忽略大小写差异。

示例

  1. 基本去重
    首先,你需要对文件进行排序,然后使用 uniq 来删除重复的行。
    sort file.txt | uniq
    
    这将先对 file.txt 中的行进行排序,然后删除连续的重复行。
  2. 计数重复行
    sort file.txt | uniq -c
    
    这将显示每行在排序后的文件中出现的次数。
  3. 仅显示重复的行
    sort file.txt | uniq -d
    
    这将仅显示那些在排序后的文件中连续出现的重复行。
  4. 仅显示唯一的行
    sort file.txt | uniq -u
    
    这将仅显示那些在排序后的文件中唯一出现的行。
  5. 忽略大小写
    如果你的文件包含大小写不同的重复项,并且你想忽略这些大小写差异,你可以使用 -i 选项。但请注意,uniq-i 选项并不是所有系统都支持,你可能需要先将文件转换为全小写或全大写,然后再进行排序和去重。
    sort file.txt | tr '[:upper:]' '[:lower:]' | uniq
    
    这里使用了 tr 命令将大写字母转换为小写字母,然后再进行排序和去重。
    uniq 命令是处理文本数据时非常有用的工具,特别是当你需要去除或统计重复行时。然而,由于它只能识别和删除连续重复的行,因此经常与 sort 命令结合使用。

tr命令

tr(translate 或 delete characters)命令是 Linux 和 Unix 系统中用于转换或删除字符的工具。它可以从标准输入(stdin)读取数据,对数据进行指定的字符转换或删除操作,然后将结果输出到标准输出(stdout)或指定的文件中。

基本用法

tr [选项] [SET1] [SET2]

或者,如果想要删除字符而不是转换,可以只指定一个集合作为要删除的字符集。

tr -d [SET1]
  • [SET1][SET2] 是字符集合,它们可以是单个字符、字符范围(例如 a-z 表示小写字母)或字符类(例如 [:alnum:] 表示字母和数字)。
  • -d 选项用于删除出现在 [SET1] 中的字符。

常用选项

  • -d:删除指定的字符集。
  • -s:将连续的重复字符压缩成一个字符,但仅当与 -d 一起使用时,它才会删除所有指定的字符,只保留一个。
  • -t:通常 tr 默认将 [SET1] 中的第一个字符转换为 [SET2] 中的第一个字符,依此类推。-t 选项用于指定转换操作,但实际上在大多数 tr 实现中,-t 并不是必需的,因为转换是默认行为。

示例

  1. 转换大小写
    echo "Hello, World!" | tr 'a-z' 'A-Z'
    
    这将把输入中的所有小写字母转换为大写字母。
  2. 删除字符
    echo "Hello, World! 123" | tr -d '0-9'
    
    这将删除输入中的所有数字字符。
  3. 压缩连续字符
    echo "Hello,   World!  " | tr -s ' '
    
    这将把输入中所有连续的空格压缩成一个空格。但是,请注意 -s 选项在这里实际上并没有与 -d 一起使用,因为我们不是在删除字符,而是在转换字符(尽管在这个例子中,我们实际上并没有改变空格字符,只是减少了它们的数量)。不过,tr-s 选项通常用于压缩连续出现的字符。
  4. 删除和压缩结合(虽然 -s 通常与 -d 一起使用以压缩并删除字符,但这里仅作为说明):
    echo "Hello, World!!!" | tr -ds ' '
    
    然而,这个命令实际上只会删除除空格之外的所有字符,并保留一个空格(因为 -d 删除了所有指定的字符,而 -s 在这里没有与 -d 结合使用时,其效果可能不明显或依赖于具体的 tr 实现)。如果你想要删除所有非空格字符并保留一个空格(这实际上是一个不常见的需求,因为 tr 不是为此设计的),你可能需要使用其他工具或组合命令来实现。
    对于删除特定字符并压缩剩余字符的常见用法,你应该首先使用 -d 删除不需要的字符,然后可能使用其他工具(如 sedawkxargs)来进一步处理输出。

cut命令

cut 命令是 Linux 和 Unix 系统中一个非常实用的文本处理工具,它主要用于按列(或字符)切割文本文件,并将结果输出到标准输出设备(通常是屏幕)或重定向到另一个文件中。

基本语法

cut OPTION... [FILE]...
  • OPTION...:一个或多个选项,用于指定 cut 命令的行为。
  • [FILE]...:一个或多个要处理的文件名。如果未指定文件名,cut 将从标准输入读取数据。

常用选项

  • -b, --bytes=LIST:仅显示由 LIST 指定的字节位置。LIST 可以是单个数字、逗号分隔的数字列表或范围(如 1-5)。
  • -c, --characters=LIST:与 -b 类似,但它是基于字符的,而不是字节。这对于多字节字符集(如 UTF-8)特别有用。
  • -d, --delimiter=DELIM:指定字段的分隔符,默认为制表符(Tab)。
  • -f, --fields=LIST:指定要显示的字段编号,字段由 -d 选项指定的分隔符分隔。LIST 可以是单个数字、逗号分隔的数字列表或范围(如 1-3)。
  • --complement:显示不在 LIST 中的字段(与 -f 一起使用)。
  • --output-delimiter=STRING:设置输出字段的分隔符(默认是输入的分隔符)。

示例

  1. 按列(字段)切割
    假设有一个名为 data.txt 的文件,内容如下,字段之间由制表符分隔:
    Name    Age    City
    Alice   30     New York
    Bob     25     Los Angeles
    
    要显示每行的第二列(年龄),可以使用:
    cut -d' ' -f2 data.txt
    
    注意:这里 -d' ' 实际上是不正确的,因为字段是由制表符分隔的,应该使用 -d'\t' 或直接省略 -d(因为制表符是默认分隔符)。正确的命令是:
    cut -f2 data.txt
    
    或者
    cut -d'\t' -f2 data.txt
    
  2. 按字节或字符切割
    假设有一个名为 text.txt 的文件,内容如下:
    Hello, World!
    
    要显示每行的前5个字符,可以使用:
    cut -c1-5 text.txt
    
    或者,如果你知道文本是 ASCII 或单字节字符集,也可以使用 -b
    cut -b1-5 text.txt
    
  3. 显示除了指定字段之外的所有字段
    使用 --complement 选项与 -f 一起,可以显示除了指定字段之外的所有字段。例如,要显示除了第二列之外的所有列:
    cut -f2 --complement data.txt
    

标签:sort,字符,cut,匹配,tr,txt,排序
From: https://blog.csdn.net/Karoku/article/details/141864051

相关文章

  • shotcut安装使用
    Download双击安装下一步指定路径勾选所需要的安装完成选择素材先复制粘贴到时间线如果底部没有这几个工具,点击顶部[查看]->[布局]->[恢复默认布局]点击中间的位置操作切割后选择删除文件,输出,视频......
  • 华为OD机试真题-增强的strstr-2024年OD统一考试(E卷)
     题目描述C语言有一个库函数Q:char*strstr(constchar*haystack,constchar*needle),实现在字符串haystack中查找第一次出现字符串needle的位置,如果未找到则返回null。现要求实现一个strstr的增强函数,可以使用带可选段的字符串来模糊査询,与strstr一样返回首次查找......
  • 今日分享——stream流和方法引用
    1.不可变集合1.1什么是不可变集合是一个长度不可变,内容也无法修改的集合1.2使用场景如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。当集合对象被不可信的库调用时,不可变形式是安全的。简单理解:不想让别人修改集合中的内容比如说:1,斗......
  • 性能、成本与 POSIX 兼容性比较: JuiceFS vs EFS vs FSx for Lustre
    JuiceFS是一款为云环境设计的分布式高性能文件系统。AmazonEFS易于使用且可伸缩,适用于多种应用。AmazonFSxforLustre则是面向处理快速和大规模数据工作负载的高性能文件系统。在本文中,我们将通过一系列测试,来评估这三种主流文件系统的性能与成本表现,帮助用户快速了解这些......
  • [ARC171C] Swap on Tree
    MyBlogs[ARC171C]SwaponTree科技改变生活。以6ms的速度拿下了目前最优解(如果已经确定了\(u\)的一个儿子\(v\)内部的操作顺序,考虑在某个时刻交换\((u,v)\)。设\(a[1,k]\)是操作\(v\)子树内部时\(v\)上面的颜色,可以发现在第\(i\)个时刻交换和在第\(j\)个时......
  • 【深度学习 transformer】使用pytorch 训练transformer 模型,hugginface 来啦
    HuggingFace是一个致力于开源自然语言处理(NLP)和机器学习项目的社区。它由几个关键组件组成:Transformers:这是一个基于PyTorch的库,提供了各种预训练的NLP模型,如BERT、GPT、RoBERTa、DistilBERT等。它还提供了一个简单易用的API来加载这些模型,并进行微调以适应特定的下游任务......
  • S-Clustr(影子集群) Simple SCC伪代码编译器,工业控制DSL结构语言,递归函数调用
    项目地址:https://github.com/MartinxMax/S-Clustr/releases200S-ClustrSimpleDSL语法内置函数示例RUN(启动设备)RUN:<ID>STOP(停止设备)STOP:<ID>TIME(MS延时)TIME:<Delay/Ms>函数示例DEF(定义函数名,空形参)DEFFunction:DEF(函数名,带形参)DEFFunction:var,......
  • 【HuggingFace Transformers】OpenAIGPTModel源码解析
    OpenAIGPTModel源码解析1.GPT介绍2.OpenAIGPTModel类源码解析说到ChatGPT,大家可能都使用过吧。2022年,ChatGPT的推出引发了广泛的关注和讨论。这款对话生成模型不仅具备了强大的语言理解和生成能力,还能进行非常自然的对话,给用户带来了全新的互动体验。然而,ChatGPT......
  • STL之string
    目录string常见的构造迭代器正向迭代器使用方法反向迭代器const正向/反向迭代器capacity接口reserve  resizestring类对象的修改操作 insert头插中间位置插入erase仅翻转字母isalpha 字符串中第一个唯一字符string常见的构造strings1("hello");str......
  • 芯片闪存(FLASH)空间不够报错——.\Objects\SL_DEMO.axf: Error: L6406E: No space in
    目录问题描述:问题解决:问题分析:解决方法:1,2,问题描述:当出现这种报错的时候:.\Objects\SL_DEMO.axf:Error:L6406E:Nospaceinexecutionregionswith.ANYselectormatchingdrv_iap.o(i.EraseFlashSector).。是由于芯片闪存(FLASH)空间不够导致的问题解决:问题分析......