我正在尝试了解N
选项在 Sed 编辑器中的工作方式。我的目标是在“file01”中将“系统管理员”更改为“桌面用户”,同时刹车线甚至最后一行。Sed 不会赶上最后一行,因为不会有下一行。另一个修改是必要的,例如添加:
sed 's/System Administrator/Desktop User/'
,但是这个和:
sed 'System\nAdministrator/Desktop\nUser/'
以一种意想不到的方式切换(对我来说),这样一个命令在最后一行或最后两行停止工作。这发生在两者N
之间或两者之间。我正在使用 GNU Sed,版本 4.4 。
#cat file01
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
Another line
And here we have: System Administrator's Group as well.
1.System Administrator's group.
2.System Administrators Group.
3.System Administrators Group.
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
System Administrators Group.
案例 1 , 之后的两个命令N
# sed '
>N
>s/System\nAdministrator/Desktop\nUser/
>s/System Administrator/Desktop User/
> ' file01
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Another line
And here we have: Desktop User's Group as well.
1.Desktop User's group.
2.System Administrators Group.
3.Desktop Users Group.
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
Desktop Users Group.
案例2,sed 's/System Administrator/Desktop User/'
之前N
。
# sed '
> s/System Adminitrator/Desktop User/
> N
> s/System\nAdministrator/Desktop\nUser/
> ' file01
The first meeting of the Linux Desktop
User's group will be held on Tuesday.
Another line
And here we have: System Administrator's Group as well.
1.Desktop User's group.
2.System Administrators Group.
3.Desktop Users Group.
The first meeting of the Linux System
Administrator's group will be held on Tuesday.
System Administrators Group.
这对我来说似乎很奇怪,并且无法弄清楚出了什么问题。[编辑]:更多细节。
我正在寻找用"Desktop User"替换"System Administrator " 。此外,如果一行以“系统”结尾而下一行以“管理员”开头,我会将它们相应地替换为“桌面”和“用户”。所有这些都取自一本书,但输出与书中所说的不符。我最终不知道出了什么问题。我发现描述我的问题的唯一世界是优先级,我道歉,看来我错了。
这实际上与优先级(通常与操作员有关)没有任何关系,而是与发出命令的顺序有关。
看一下问题中的第一个示例:
这将成对读取行并对其应用两个替换。如果该对中的第二行以
System
(具有Administrator
以下第三行)结尾,那么它将无法检测到。这意味着当跨越奇偶线时,字符串不会被替换。看一下问题中的第二个示例(拼写更正):
这将更改当前行上的字符串,读取下一行并在中间用换行符更改字符串。 这不会更改带有完整字符串副本的奇数行(或仅带有字符串的奇数行
System
)。使用 GNU
sed
:该脚本循环并将文件的所有行读入模式空间。一旦它到达输入的最后一行,它就会全局执行替换,同时允许两个单词之间的任何字符(也可以使用
\([ \n]\)
)而不是\(.\)
)。结果将是
当搜索可能跨越两行的模式时,与and - aka a
N
一起使用,以便在模式空间1中始终有两行:P
D
N;P;D cycle
请注意,这
s/System\nAdministrator/Desktop\nUser/
是gnu sed
语法。便携你会做1:它从第 1-2 行开始,在 P;D 之后处理第 2-3 行,然后是第 3-4 行,依此类推...