【问题标题】:find and replace with sed查找并替换为 sed
【发布时间】:2012-06-24 19:44:52
【问题描述】:

我有以下问题。

我有一个包含很多单词的文件,我要做的就是在另一个文件中找到这些单词,然后用一个字母替换它们。

我不知道要删除的单词(太多了!)所以我不知道如何使用以下 sed 命令

$ sed -i 's/words_old/word_new/g' /home/user/test.txt

但是我认为我还必须使用 cat 命令:

$ cat filewithwordstobedeleted.txt

但我不知道如何组合它们。

谢谢你帮助我! :)

法比奥

【问题讨论】:

  • word_new 是从哪里来的?它们是否也在filewithwordstobedeleted.txt中指定,在每个单词旁边,还是用相同的字母替换所有单词?
  • 我必须用“null”这个词替换所有单词
  • 谨防clbuttic 错误。

标签: bash replace sed find


【解决方案1】:

假设您每行有一个要删除的单词,一个简单的 shell 循环可以帮助您:

cat filewithwordstobedeleted.txt | while read word; do
    sed -i "s/$word/null/g" /home/user/test.txt
done

请注意,cat 的使用并非绝对必要,但可以让这个示例更易于阅读。

【讨论】:

  • 对于好奇的人,没有猫的替代品是while read word; do ...; done < filewithwordstobedeleted.txt
  • 这也是我的建议。但是,我想知道,由于多次调用 sed,它是否会比你可以通过单次 sed 运行以某种方式做到这一点更慢?
  • 我试过了,但它的工作方式很奇怪,可能是因为我每行没有一个单词。因此,不是用“null”替换每个单词,而是在每一行中放置“null”。它应该以这种方式工作:橙色菠萝苹果(同一行)-> null null null 或 orangepineappleapple --> nullnullnull
【解决方案2】:

如果您的单词列表是每行一个并且不是很长:

sed -ri "s/$(tr "\n" "|" < filewithwordstobedeleted.txt | head -c-1)/null/g" /home/user/test.txt

【讨论】:

  • 不,不幸的是不是单词列表,而是同一行上的一系列单词,例如:我想将其作为 null null null 或 orangepineappleapple --> nullnullnull。是的,时间长得可笑,但时间不是问题。我可以让它在没有任何问题的服务器上运行。
  • @fabioln79:我的意思是如果要删除的单词列表(filewithwordstobedeleted.txt)是每行一个。如果要修改的文件每行有多个单词,则我的命令有效。长度与运行时间无关,而是它是否超过您正在运行的系统的命令行容量(我的系统上为 2MB)。
【解决方案3】:

这可能对你有用(GNU sed):

# cat <<\! >/tmp/a
> this
> that
> those
> !
cat <<\! >/tmp/b
> a
> those
> b
> this
> c
> that
> d
> !
sed 's|.*|s/&/null/g|' /tmp/a
s/this/null/g
s/that/null/g
s/those/null/g
sed 's|.*|s/&/null/g|' /tmp/a | sed -f - /tmp/b
a
null
b
null
c
null
d
cat <<\! >/tmp/c
> a
> this and that and those
> b
> this and that
> c
> those
> !
sed 's|.*|s/&/null/g|' /tmp/a | sed -f - /tmp/c
a
null and null and null
b
null and null
c
null

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2016-05-30
    • 2022-12-11
    • 2020-06-24
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多