【问题标题】:If a line starts with a specific word, how to change a targeted word in that line if it does exist?如果一行以特定单词开头,如果该行中的目标单词确实存在,如何更改它?
【发布时间】:2013-05-05 11:35:35
【问题描述】:

希望搜索目录中的所有文件,查看每一行,如果该行以诸如“This”之类的单词开头,则搜索该行以查找并替换目标单词。我确实得到了一个解决方案,因为它是一个单行命令,但如果可能的话,希望将它作为 perl 文件或使用 bash 的 .txt 文件。

例子:

This rabbit jumped high

The rabbit jumped high

(如果该行以“This:”开头,则查找并将高替换为低:

This rabbit jumped low

The rabbit jumped high

【问题讨论】:

  • 这似乎微不足道,请展示您的尝试。这只是一个ifs///
  • 你已经在这里问过这个问题:“If a sentence starts with a specific word, how to change a word in that sentence if it does exist?”。将命令放入脚本中很简单
  • @Barmar,我什么都没试过,如果它在脚本上,我不知道该怎么做,我只看到了一个关于如何在命令行上做的解决方案这里:stackoverflow.com/questions/16371999/…
  • @amon,是的,这就是我在原始问题中提到的。
  • 你知道如何在 perl 中编写if 语句吗?你知道如何在 perl 中进行替换吗?你知道如何在 perl 中循环输入吗?将它们放在一起,您就有了解决方案。

标签: perl bash


【解决方案1】:
sed '/^This/{s/high/low/g}' file

会为你做的:

kent$  echo "This rabbit jumped high

The rabbit jumped high"|sed '/^This/{s/high/low/g}'
This rabbit jumped low

The rabbit jumped high

如果你想替换 word "high" 而不是 text high:

sed '/^This/{s/\<high\>/low/g}' file

例如:

kent$  echo "This rabbit jumped high with highfoo      

The rabbit jumped high"|sed '/^This/{s/\<high\>/low/g}' 
This rabbit jumped low with highfoo

The rabbit jumped high

【讨论】:

  • @fedorqui 用低替换所有高。
  • 是的,我知道s/high/low/g 语法。我不熟悉的是/^This/{},我想这是一个条件,在这种情况下会执行{}
  • @fedorqui 是的,你是对的。并且可以省略此答案中的{}。因为如果匹配/^This/,则只有一个命令s{} 如果在条件行时需要执行多条命令,这将很有用。类似于if(foo){ }
  • 这很酷,很高兴知道。感谢您的解释,我现在很清楚:)
  • 我正在寻找的是可以读取目录中所有文档并更改该文件中的单词的东西。
【解决方案2】:

您可以将单行命令放在 bash 脚本中。

单行命令是什么,它有什么问题,你翻译它的困难是什么?在要求我们以不同的方式复制解决方案的同时,有一个解决方案而不与我们分享,这是一种粗鲁的做法。

【讨论】:

【解决方案3】:

bash 中执行此操作会非常复杂,但 shell 的强大之处在于它们能够调用其他程序(例如 Perl)来完成繁重的工作。

如果每行最多只能有一个目标词:

perl -pe's/^This\b.*\K\bhigh\b/low/'

否则,

perl -pe's/\bhigh\b/low/ if /^This\b/'

注意事项:

  • 仅替换 \K 之后的内容。 (“K”代表“保持”)。
  • \b 有助于确保“This”和“high”不是另一个词的一部分(如“thight”)。

用法:

perl -pe'...'            # From STDIN to STDOUT
perl -pe'...' file       # From file(s) to STDOUT
perl -i~ -pe'...' file   # Edit file(s) "in-place" (with backup).
perl -i -pe'...' file    # Edit file(s) "in-place" (without backup).

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多