从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 中的循环来做的事情吗?我可以遍历单个列(逐行),但我不确定如何处理匹配的列。

任何帮助将不胜感激。

【问题讨论】:

wrt wherever they appear - Sample1 是否出现在文本 Sample10_trait2 中?在FooSample1_trait2 怎么样?如果任一问题的答案是否定的,那么我们如何识别Samples 的分隔符,例如要匹配的文本是否总是出现在行首并且总是后跟下划线?不,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 代码中没有循环。注意模式中的_;这对于防止Sample3Sample300 映射到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命令替换文件中的第一个出现[重复]

如何用 sed 替换缩小的 javascript 文件中的多个值 [重复]

sed:查找并替换以特定字符串开头的行中的第 n 个字符

如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

Bash:从脚本中查找并替换文本

查找和替换字符串中的文本[重复]