【发布时间】:2016-12-27 17:57:58
【问题描述】:
我想在 SED 中替换我的模式空间。我可以用s/^.*$/hello world/; 做到这一点 - 但我可以用c 命令以某种方式做到这一点 - 在我的 sed 脚本中不使用换行符吗?我不完全清楚这是否有可能。
(a 和 i 命令的问题相同)
【问题讨论】:
标签: sed text-processing
我想在 SED 中替换我的模式空间。我可以用s/^.*$/hello world/; 做到这一点 - 但我可以用c 命令以某种方式做到这一点 - 在我的 sed 脚本中不使用换行符吗?我不完全清楚这是否有可能。
(a 和 i 命令的问题相同)
【问题讨论】:
标签: sed text-processing
如果您的 shell 是 bash,这里有一种在单行中使用 c 的便捷方法:
$ seq 3 | sed $'/2/c\\\nNew Text'
1
New Text
3
这会查找包含2 的任何行并将其更改为New Text。
这使用 bash 的 $'...' 功能在字符串中输入换行符。换行符由\n 表示。 c 后面需要的反斜杠用\\ 表示。
$'...' 功能也可用于ksh93、zsh、mksh 和 FreeBSD sh。
【讨论】:
您无法控制a,i,r 等。人。他们打印stuff + \n。
相反,使用s 修改模式空间并使用P 打印模式空间直到,不包括换行符,以获得所需的结果。
printf 'foo\nfoo' | sed -n 'P' | cat -A
foo$
foo
a/i 不起作用
printf 'foo\nfoo' | sed -n '
#print pattern-space wo. newline
P
# apppend the char F
aF
' | cat -A
foo$
F$
foo$
F$
我相信它的工作方式类似于r/R。它在循环之后附加,并且总是带有换行符。
但您始终可以将N 与s 一起使用。即。
printf 'foo\nfoo' | sed -n -e '
# append \n + nextline wo. its \n to pattern-space
N
' -e '
# replace the 1st \n with bar (append without trailing \n)
s@\n@bar@
' -e '
# print pattern-space up until, excluding \n
P
' | cat -A
foo$
bar$
foo$
bar
printf 'foo\nfoo' | sed -n -e '
# expect last-line, append \n and read next-line
$! {
N
}
' -e '
# replace \n with bar \n
s@\n@bar\n@
' -e '
# on last line ($), append bar wo. new-line
$ {
s@$@bar@
}
' -e '
# print pattern-space in its entirety
p
' | cat -A
foobar$
foobar
cat -A 在输出中显示换行符 ($)@ 作为s 的分隔符。这是个人的,可能是愚蠢的偏好。如果你愿意,它可以是标准的/、| 或þ。-e 'cmd' 分隔了命令,包括 cmets。printf 'foo\nfoo' | sed -n '$!;s@\n@bar\n@;$s@$@bar@;p' | cat -A
sed 语法突出显示的vim 等编辑器。#!/bin/sed -f
# expect last-line, append \n and read next-line
$! {
N
}
# replace \n with bar \n
s@\n@bar\n@
# on last line ($), append bar wo. new-line
$ {
s@$@bar@
}
# print
p
调试
l=【讨论】: