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

问题描述 投票:0回答:4

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

<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
regex bash awk sed grep
4个回答
1
投票
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引用它们。因此,第一个\n的内容可以在以后用(``)等参考。


1
投票

使用\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
投票

[^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\n" "${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位数字和最后一个你想象的数字。


0
投票

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

$ bash script.sh
234567 876352
234567 876352
224967 676353
224967 376353
224967 476353
© www.soinside.com 2019 - 2024. All rights reserved.