首页 > 解决方案 > 如何替换 10000 行中的文本

问题描述

我有超过 10000 个这样的文件,我正在尝试将它们作为模板

我的弦是这样的

"MLKT_3C_AAAU_01A" 
"MLKT_3C_AALI_01A"
"MLKT_3C_AALJ_01A" 
"MLKT_3C_AALK_01A"
"MLKT_4H_AAAK_01A"

我正在尝试将它们转换为此

names(MLKT_3C_AAAU_01A)[2] <- '3C_AAAU_01A' df<- full_join(df,MLKT_CS_4942_01A, by = 'V1')
names(MLKT_3C_AALI_01A)[2] <- '3C_AALI_01A' df<- full_join(df,MLKT_3C_AALI_01A, by = 'V1')
names(MLKT_3C_AALJ_01A)[2] <- '3C_AALJ_01A' df<- full_join(df,MLKT_3C_AALJ_01A, by = 'V1')
names(MLKT_3C_AALK_01A)[2] <- '3C_AALK_01A' df<- full_join(df,MLKT_3C_AALK_01A, by = 'V1')
names(MLKT_4H_AAAK_01A)[2] <- '4H_AAAK_01A' df<- full_join(df,MLKT_4H_AAAK_01A, by = 'V1')

到目前为止,我遇到的最好的方法是使用文本编辑器并一个一个地制作它们。我想知道 bash 中是否有办法获取上述字符串并将其转换为我提供的示例?

在开始之前,我从每一行中删除引号

sed 's/\"//g' example.txt > exampleout.txt

起初我尝试names(在每行的开头添加。所以让我们想象一下,每行包含所有这些字符串的文件称为 exampleout.txt。这给了我三个时间的名字(而不是一次

awk '$0="names("$0' exampleout.txt > myout.txt

然后我尝试)[2] <- '' df<- full_join(df,, by = 'V1')使用以下内容粘贴在每行的末尾

sed -e 's/$/)[2] <- '' df<- full_join(df,, by = 'V1') /' myout.txt > myout2.txt

所以它让我想到了这个

names(MLKT_3C_AAAU_01A )[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_3C_AALI_01A)[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_3C_AALJ_01A )[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_3C_AALK_01A)[2] <-  df<- full_join(df,, by = V1) 
names(MLKT_4H_AAAK_01A)[2] <-  df<- full_join(df,, by = V1) 

标签: bashawksed

解决方案


您实际上可以在一个命令中完成所有操作。下面的脚本类似于sed,只是我选择使用perl非贪婪匹配 ( .*?_(.*)) 来分隔第一个下划线字段。

perl -pe "s/^\"(.*?_(.*))\"$/names(\1)[2] <- '\2' df <- full_join(df, \1, by 'V1')/" example.txt

在这里,我捕获了两个字符串。

  1. 双引号内的所有内容,以及
  2. 第一个下划线之后的所有内容。

例如,在 中"MLKT_3C_AAAU_01A",第一次捕获是MLKT_3C_AAAU_01A,第二次捕获是3C_AAAU_01A

之后,进行适当的替换。


如果第一个下划线之前的字段是常量(例如MLKT),您可以使用sed,将非贪婪匹配替换为常量。

sed -E "s/^\"(MLKT_(.*))\"$/names(\1)[2] <- '\2' df <- full_join(df, \1, by 'V1')/" test.txt

注意-E标志的使用(用于扩展的正则表达式/更容易的组捕获)和双引号的使用(用于使用单引号作为替换的一部分)。


推荐阅读