使用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 等)