从sed中的文本文件中查找并替换多个字符串[重复]
Posted
技术标签:
【中文标题】从sed中的文本文件中查找并替换多个字符串[重复]【英文标题】:find and replace multiple strings from text file in sed [duplicate] 【发布时间】:2015-05-14 22:45:50 【问题描述】:下面是一个包含样本和特征信息的玩具文本文件,以及一个测量值。
Sample3_trait1 8.5
Sample6_trait2 2.2
Sample7_trait1 9.2
Sample3_trait2 1.3
Sample6_trait1 10.0
Sample7_trait2 2.1
我想将示例列替换为提供更多信息的内容,例如示例的实际名称(例如人名)。如果只有 3 个样本,这在 sed
中会相对容易,例如
sed 's/Sample3/john.D/g' file.txt
我可以为每个“样本”执行此操作。但我有 100 或数千个样本名称。
id 喜欢做的是给sed
一个包含两列的文本文件,原始的和替换的:
Sample3 john.D
Sample6 mary.D
Sample7 kelly.O
....
Sample1001 amy.P
并将它们替换为整个文件中出现的任何位置(全局),即,无论在哪里找到 Sample3,都替换为 john.D。
这是我可以用 Bash 中的循环来做的事情吗?我可以遍历单个列(逐行),但我不确定如何处理匹配的列。
任何帮助将不胜感激。
【问题讨论】:
wrtwherever they appear
- Sample1
是否出现在文本 Sample10_trait2
中?在FooSample1_trait2
怎么样?如果任一问题的答案是否定的,那么我们如何识别Sample
s 的分隔符,例如要匹配的文本是否总是出现在行首并且总是后跟下划线?不,bash 中的循环始终是处理文本的错误方法。
【参考方案1】:
在这里使用awk
更好:
awk -v OFS=_ 'NR==FNRa[$1]=$2;next $1 in a$1=a[$1] 1' names.txt FS=_ file.txt
john.D_trait1 8.5
mary.D_trait2 2.2
kelly.O_trait1 9.2
john.D_trait2 1.3
mary.D_trait1 10.0
kelly.O_trait2 2.1
names.txt
在哪里:
Sample3 john.D
Sample6 mary.D
Sample7 kelly.O
【讨论】:
【参考方案2】:使用sed
将第二个文件转换为编辑第一个文件的sed
脚本:
sed 's/\([^ ]*\) \(.*\)/s%\1_%\2_%/' file.2 > sed.script
sed -f sed.script file.txt
rm -f sed.script
Bash 代码中没有循环。注意模式中的_
;这对于防止Sample3
将Sample300
映射到john.D00
至关重要。
如果您应该担心脚本的中断和并发运行,那么 (a) 使用 mktemp
生成文件名来代替 sed.script
,并且 (b) 捕获中断等以确保删除脚本文件名:
tmp=$(mktemp "$TMPDIR:-/tmp/sed.script.XXXXXX")
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
sed 's/\([^ ]*\) \(.*\)/s%\1_%\2_%/' file.2 > $tmp
sed -f $tmp file.txt
rm -f $tmp
trap 0
【讨论】:
以上是关于从sed中的文本文件中查找并替换多个字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何用 sed 替换缩小的 javascript 文件中的多个值 [重复]