在 Unix 文件中用另一个列表替换字符串列表的有效方法是什么?
假设我有两个字符串列表(列表 A 和列表 B),每个列表中的条目数 N 完全相同,并且我想将 A 中出现的所有第 n 个元素替换为 A 中 B 的第 n 个元素Unix 中的文件(最好使用 Bash 脚本)。
最有效的方法是什么?
一种低效的方法是对“sed s/stringA/stringB/g
”进行 N 次调用。
Suppose I have two lists of strings (list A and list B) with the exact same number of entries, N, in each list, and I want to replace all occurrences of the the nth element of A with the nth element of B in a file in Unix (ideally using Bash scripting).
What's the most efficient way to do this?
An inefficient way would be to make N calls to "sed s/stringA/stringB/g
".
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这将一次性完成。它将 listA 和 listB 读取到 awk 数组中,然后对于 linput 的每一行,它检查每个单词,如果在 listA 中找到该单词,则将该单词替换为 listB 中的相应单词。
我假设 listA 中的字符串不包含空格(awk 的默认字段分隔符)
This will do it in one pass. It reads listA and listB into awk arrays, then for each line of the linput, it examines each word and if the word is found in listA, the word is replaced by the corresponding word in listB.
I'm assuming the strings in listA do not contain whitespace (awk's default field separator)
对编写 sed 脚本的
sed
进行一次调用,然后再调用一次来使用它?如果您的列表位于文件listA
和listB
中,那么:我正在对不包含冒号或百分号的“单词”做出一些全面的假设,但您可以进行调整那。某些版本的 sed 对可指定的命令数量有上限;如果这是一个问题,因为你的单词列表足够大,那么你可能必须将生成的 sed 脚本分割成单独的文件来应用 - 或者更改为使用没有限制的东西(例如 Perl)。
另一个需要注意的事项是更改的顺序。如果你想交换两个单词,你需要仔细制作你的单词列表。一般来说,如果将 (1) wordA 映射到 wordB,(2) wordB 映射到 wordC,则 sed 脚本是否在映射 (2) 之前或之后进行映射 (1) 很重要。
显示的脚本没有注意单词边界;您可以通过多种方式对其进行仔细处理,具体取决于您使用的
sed
版本以及您对单词构成的标准。Make one call to
sed
that writes the sed script, and another to use it? If your lists are in fileslistA
andlistB
, then:I'm making some sweeping assumptions about 'words' not containing either colon or percent symbols, but you can adapt around that. Some versions of
sed
have upper bounds on the number of commands that can be specified; if that's a problem because your word lists are big enough, then you may have to split the generated sed script into separate files which are applied - or change to use something without the limit (Perl, for example).Another item to be aware of is sequence of changes. If you want to swap two words, you need to craft your word lists carefully. In general, if you map (1) wordA to wordB and (2) wordB to wordC, it matters whether the sed script does mapping (1) before or after mapping (2).
The script shown is not careful about word boundaries; you can make it careful about them in various ways, depending on the version of
sed
you are using and your criteria for what constitutes a word.我需要做类似的事情,最后我根据映射文件生成 sed 命令:
确保您的 shell 支持与映射中一样多的 sed 参数。
I needed to do something similar, and I wound up generating sed commands based on a map file:
Make sure your shell supports as many parameters to sed as you have in your map.
这对于 Tcl 来说相当简单:
This is fairly straightforward with Tcl:
您可以在 bash 中执行此操作。将列表放入数组中。
you can do this in
bash
. Get your lists into arrays.