Text 如何使用bash/shell更改特定列内容字符串?
我有一个.txt文件,看起来像这样(大约400行): 莴苣根瘤菌1240 J_C7R5_99354_KNKSR3_寡霉素81.52 莴苣根管蛋白70 Lettusecfmnode_17813 G_C4R5_80184_KNKS113774F_Tetronasin 79.57 Lettusecfmnode_69469 J_C11R7_99276_KNKSF2_制霉菌素87.27 我想编辑整个第二列中的名称,以便只保留最后一部分(意味着删除之前的任何内容,因此实际上保留最后一列之后的内容)。 我研究了使用Text 如何使用bash/shell更改特定列内容字符串?,text,sed,Text,Sed,我有一个.txt文件,看起来像这样(大约400行): 莴苣根瘤菌1240 J_C7R5_99354_KNKSR3_寡霉素81.52 莴苣根管蛋白70 Lettusecfmnode_17813 G_C4R5_80184_KNKS113774F_Tetronasin 79.57 Lettusecfmnode_69469 J_C11R7_99276_KNKSF2_制霉菌素87.27 我想编辑整个第二列中的名称,以便只保留最后一部分(意味着删除之前的任何内容,因此实际上保留最后一列之后的内容)。 我研究
cut
和sed
组合的不同解决方案,但无法理解代码应该如何构建。
如果您有任何建议和帮助,我们将不胜感激
谢谢大家! 这里有一种方法:
perl -pe 's/^\S+\s+\K\S+_//'
对于每一行输入(-p
),我们执行一些代码(-e…
)
代码执行子替换(s/PATTERN/REPLACEMENT/
)
模式匹配如下:
字符串的开头^
1个或多个非空白字符(第一列)\S+
1个或多个空白字符(第一列后的空格)\s+
不要将匹配的文本视为最终匹配的一部分\K
1个或多个非空白字符(第二列)\S+
下划线
+
是贪婪的(它匹配尽可能多的字符),\S+
将匹配第二列中最后一个\
的所有内容
因为我们使用了\K
,所以只替换模式的其余部分(即第二列中的匹配部分)
替换字符串为空,因此将有效删除匹配项。使用sed:
sed 's/ [^ ]*_/ /' file
将第一个空格替换为非空格字符(
[^]*
),然后将替换为一个空格。WOW。成功了!谢谢我甚至没有想过使用perl。