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
与后跟任意数量的空格或制表符以及单词开头模式 ( )的单词匹配\<
。它将替换为x
and 无论找到多少空格或制表符。open
如果它位于单词之前,则将其替换。
第二次替换将任何剩余单词替换open
为l
。