用各种条件替换“打开”一词

用各种条件替换“打开”一词

sed我编写了一个具有以下条件的替换脚本:

  • 如果单词“open”位于另一个单词之前,请将单词“open”更改为“x”。
  • 如果单词“open”不在另一个单词之前,请将单词“open”更改为“l”。

例如预期输入:

open
open door
open blue door
can you open door
the door is open

预期输出为:

l
x door
x blue door
can you x door
the door is l

我刚刚实现的代码只是(因为我对它真的很陌生):

sed 's/open/x/g'

答案1

我们仍然只能猜测如何处理标点符号,因此像open, close有两个单词但它们在语义上是分离的情况……是不是包括(不进行更换!)。

到目前为止,对我来说有以下工作:

$ cat test.txt
open  
open door
open blue door
can you open door
the door is open
$ sed -E 's/\<open([[:space:]]+[[:alnum:]]+)/x\1/g;s/\<open[[:space:]]*$/l/g' test.txt
l
x door
x blue door
can you x door
the door is l

答案2

使用您在问题中提供的示例数据:

$ sed -E -e 's/\<open([[:space:]]+)\</x\1/g' -e 's/\<open\>/l/g' file
l
x door
x blue door
can you x door
the door is l

sed对每行应用两次替换。第一个替换open与后跟任意数量的空格或制表符以及单词开头模式 ( )的单词匹配\<。它将替换为xand 无论找到多少空格或制表符。open如果它位于单词之前,则将其替换。

第二次替换将任何剩余单词替换openl

相关内容