Ole*_*sii 6 command-line grep sed awk text-processing
我有带有文本的文件:
1861_ASSET-D_T_201702181000-201702181045_HN_
197895_STRING-H_T_201702181000-201702181045_HN_
14512861_FILE-FD_T_201702181000-201702181045_HN
Run Code Online (Sandbox Code Playgroud)
如何使用 egrep、awk 或 sed 在第一个和第二个匹配项“_”之间分配文本?
我希望有:
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)
Yar*_*ron 10
您可以使用awk以下参数:
-F "_" -_用作分隔符'{print $2}' - 打印第二个元素
$ awk -F "_" '{print $2}' input_file
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)Zan*_*nna 10
$ sed -r 's/[^_]+_([^_]+)_.*/\1/' file
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)
-r 使用 EREs/old/new/替换old为new[^_]+ 一些没有下划线的字符(some chars)保存some chars以备后用.* 任意数量的任意字符\1 保存的模式如果你想允许其他工具,cut将是最简单的解决方案:
cut -d _ -f 2 < input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
几个 perl 方法:
$ perl -F_ -lae 'print $F[1]' file
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)
这-a使得 perl 像 awk 一样,在给定的字符上拆分每个输入行-F并将每个结果字段保存在数组中@F。因此,打印$F[1]将打印第二个字段(数组从 0 开始计数)。
或者:
$ perl -pe 's/.*?_(.+?)_.*/$1/' file
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)
该-p手段“运行给出的剧本后打印每个输入行-e就可以了”。该s/from/to/是替换操作符。它将替换from为to. 在这里,我匹配 0 个或多个字符 ( .*) 但使其“非贪婪” ( .*?);这?使它在尽可能短的比赛中停止。因此,.*?_将匹配到 1st 的所有内容_。下一部分,(.+?)_匹配一个或多个字符直到下一个_,然后我们匹配其他所有字符,直到行尾 ( .*)。括号“捕获”匹配项,并将其作为$1. 因此,整个事情只会用括号内的内容替换整行。
你也可以这样做grep:
$ grep -oP '^.*?_\K[^_]+' file
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)
的-o意思是“只打印匹配的每一行的一部分”和-P有关Perl兼容正则表达式(PCRE),这给我们圈\K。该\K反过来,意思是“不顾一切匹配,直到这一点。” 这意味着我们可以使用^.*?_来匹配所有内容,直到第一个_,然后使用\K丢弃它,这样它就不会被打印出来。然后,我们只需要_我们能找到的尽可能多的非字符 ( [^_]+)。
作为 python 单线:
python3 -c "[print(l.split('_')[1]) for l in open('f')]"
Run Code Online (Sandbox Code Playgroud)
'f'你的文件在哪里,用引号引起来,例如:
python3 -c "[print(l.split('_')[1]) for l in open('/home/jacob/blub')]"
ASSET-D
STRING-H
FILE-FD
Run Code Online (Sandbox Code Playgroud)
for l in open('f')
Run Code Online (Sandbox Code Playgroud)
每行读取 f ,和
l.split('_')[1]
Run Code Online (Sandbox Code Playgroud)
按 delimiter 分割行_,保留第二个字符串(index [1],其中[0]是第一个。
print(l.split('_')[1])
Run Code Online (Sandbox Code Playgroud)
随后打印找到的字符串。