使用awk / grep / sed / bash / vim进行正则表达式匹配和打印

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用awk / grep / sed / bash / vim进行正则表达式匹配和打印相关的知识,希望对你有一定的参考价值。

我有一个文本文件,其中每行具有以下结构

<six digit number>;; some text of arbitrary (non-zero) length<another six digit number>some other (possibly zero length) text

我想只从每行中提取六位数字对。例如,如果一行包含

234567;; some text with any number of arbitrary characters876352some other text

输出将是

234567;;876352

我尝试过使用awk / grep / sed / bash / vim的解决方案总数太多了,无法在此处列出。下面是其中之一

#!/bin/bash

truncate --size 0 file.out
for line in "$(cat ../allwithpins)";
do
    echo $line | 'match($0, /[0123456789]{6}/, ary) {print ary[0], ary[1]}' >> file.out
    # echo $line
    # if [[ $line =~ [0123456789]{6} ]];
    # then
    #     echo ${BASH_REMATCH[$1]}
    #     #echo ${BASH_REMATCH[$1]}
    #     #echo ${BASH_REMATCH[$2]}
    # fi;
done
答案
sed -r 's/^([0-9]{6};;).*([0-9]{6}).*/1 2/g' inputfile
234567;;876352

注意:如果您希望输出不被qazxsw poi分隔:

;;

在这里,我们在这里捕捉sed -r 's/^([0-9]{6}).*([0-9]{6}).*/1 2/g' inputfile (中的文本组,然后使用)1 ... 2引用它们。因此,第一个 的内容可以在以后用(``)等参考。

另一答案

使用1的另一种解决方案

awk
  • awk -F"[^0-9;]" '{print $1$(NF)}' 将字段分隔符设置为除数字和-F"[^0-9;]"之外的任何值
  • ;对于每个输入行,打印由指定的分隔符分隔的第一个和最后一个字段。 print $1$(NF)是字段的总数,因此NF将是最后一个字段。

$(NF)

编辑

如果您想要对数字等添加更多检查,正则表达式比较可以帮助您。

$ echo "234567;; some text with any 123 number of arbitrary characters876352" | awk -F"[^0-9;]" '{print $1$(NF)}'
234567;;876352
  • $ awk -F"[^0-9;]" '$1 ~ /[0-9]{6};;/ && $0 ~ /[^0-9][0-9]{6}$/{print $1$(NF)}' file 234567;;876352 234567;;876352 $ cat file 234567;; some text with any number of arbitrary characters876352 234567;; some text with any number of arbitrary characters876352iaasdfadf 234567;; some text with any number of arbitrary characters876352 234567;; some text with any number of arbitrary characters8763 234567;; some text with any number of arbitrary characters876352iaasdfadf0987654321 检查第一个字段是否包含6个数字,后跟$1 ~ /[0-9]{6};;/
  • ;;检查输入行是否以6位数结尾。 $0 ~ /[^0-9][0-9]{6}$检查6位数字是否前面没有其他数字。
另一答案

[^0-9]的解决方案,内置bash功能,使用regEx运算符(从=~开始支持)

bash 3.0

在示例文件上运行脚本

#!/bin/bash

while IFS= read -r line
do
    [[ $line =~ ^([[:digit:]]{6}).*([[:alpha:]]+)([[:digit:]]{6})([[:alnum:]]+).*$ ]]
    printf "%s %s
" "${BASH_REMATCH[1]}"  "${BASH_REMATCH[3]}"
done <file

产生结果为

234567;; some text with any number of arbitrary characters876352some other text
234567;; some text with any number of arbitrary characters876352abcd 124356
224967;; some text with any abpsf242432 of arbitrary characters676353abcd 2343
224967;; some text with any 222355 of arbitrary characters376353cbdw 53534e
224967;; some text with any 21462@2 of arbitrary characters476353cwsf543643

这是前面的6位数字和最后一个你想象的数字。

另一答案

使用sed,删除除数字和分号之外的所有字符:

$ bash script.sh
234567 876352
234567 876352
224967 676353
224967 376353
224967 476353

以上是关于使用awk / grep / sed / bash / vim进行正则表达式匹配和打印的主要内容,如果未能解决你的问题,请参考以下文章

Bash - Linux - 在一行中找到匹配并打印到SED / Awk / Grep行的末尾

希望重新实现从 bash/grep/sed/awk/(auto)make/configure 到更健全的构建工具链(例如 boost.build 等)

Linux与bash:2.Linux终端命令之三剑客命令(grep,sed,awk)

正则与sed,grep,awk三剑客

十七. 正则以及grep ,sed,awk的简单应用

linux三剑客的基本使用——grep、sed、awk