查找具有未知起点的子字符串,并在较大的字符串中确定不确定的长度

时间:2017-01-25 00:43:42

标签: string search grep

查找具有未知起点的子字符串,并在较大的字符串

中确定不确定的长度
(.+)([A-Z\.]+)(.+)

我想要提取的子字符串只有大写字母和句点:[A-Z \。] +

子字符串在不同文档中的长度不同

我不知道我正在寻找的子字符串之前的子字符串的长度。

你可以从上面的grep看到grep的第一部分

(.+)

基本上抓住了整个字符串。

如何创建一个grep,说明:找到X个字符直到您遇到一串只有大写字母和句点的字符串。

(如何替换grep的第一部分?)

示例字符串:

###_random_length_data_here_###____YFJSR.BZMN.FZGTSODZY.RIVU.ZPZOQPIKC.TIVIUHIFV.HBXORXONITZMN....NUH...NTL...KTM.PESNLQ.OZQEHESQORNHLI.ULNLBMRSQ.XWK.OWEBGKTHM.EMVQFXPXCMBTSX.KRBKUU.ENP...DGW...RJB....HININSFJBJIXG.TTFDZRUBD.GIXVFMZEH.FOQU.WBFMWWVOG.HOQI.FOHZK___###_other_random_length_data_here_###

中间的数据从字符串中的未知索引开始,具有不同的长度,具体取决于文档。

预期输出只是第二个子字符串:

YFJSR.BZMN.FZGTSODZY.RIVU.ZPZOQPIKC.TIVIUHIFV.HBXORXONITZMN....NUH...NTL...KTM.PESNLQ.OZQEHESQORNHLI.ULNLBMRSQ.XWK.OWEBGKTHM.EMVQFXPXCMBTSX.KRBKUU.ENP...DGW...RJB....HININSFJBJIXG.TTFDZRUBD.GIXVFMZEH.FOQU.WBFMWWVOG.HOQI.FOHZK

下划线和磅符号在实际数据中不是分隔符,只是为了显示三个子串之间的某些分隔并使示例数据更易于阅读。

1 个答案:

答案 0 :(得分:1)

只需使用带有GNU grep标记的-E进行扩展正则表达式语法匹配,匹配[A-Z].及其多个实例,

grep -Eo '[A-Z|.]+' file
YFJSR.BZMN.FZGTSODZY.RIVU.ZPZOQPIKC.TIVIUHIFV.HBXORXONITZMN....NUH...NTL...KTM.PESNLQ.OZQEHESQORNHLI.ULNLBMRSQ.XWK.OWEBGKTHM.EMVQFXPXCMBTSX.KRBKUU.ENP...DGW...RJB....HININSFJBJIXG.TTFDZRUBD.GIXVFMZEH.FOQU.WBFMWWVOG.HOQI.FOHZK

(或)使用egrep

egrep -o '[A-Z|.]+' file
YFJSR.BZMN.FZGTSODZY.RIVU.ZPZOQPIKC.TIVIUHIFV.HBXORXONITZMN....NUH...NTL...KTM.PESNLQ.OZQEHESQORNHLI.ULNLBMRSQ.XWK.OWEBGKTHM.EMVQFXPXCMBTSX.KRBKUU.ENP...DGW...RJB....HININSFJBJIXG.TTFDZRUBD.GIXVFMZEH.FOQU.WBFMWWVOG.HOQI.FOHZK

在包含二进制.txt文件的文件夹

中运行这样的循环
for file in *.txt
do
   grep -Eao '[A-Z|.]+' "$file" >> outputFile.txt
done

(或)包含文本文件的文件夹中的命令行友好版本

for file in *.txt; do grep -Eao '[A-Z|.]+' "$file" >> outputFile.txt; done

这会将grepregex一起运行到目录中的所有文件,并将其附加到outputFile.txt