GNU sed 在附加文本时指定结束位置
GNU sed specify the end position when appending text
我想在匹配模式时通过 sed
做两件事:
- 用字符串替换模式
- 在这一行之后追加另一个字符串
比如一个文本文件中的原始内容是:
abc
123
edf
我想将 123
替换为 XXX
并在行后附加 YYY
:
abc
XXX
YYY
edf
我尝试通过 sed '/123/{s/123/XXX;a\YYY\}'
执行此操作,但出现错误:Unmatched "{"
。
命令 a
似乎将其后的所有字符视为 文本以追加 。那么我怎样才能让a
知道追加的文本的结束位置呢?
在 bash
中,这可能是 最简单的 使用 sed
:
sed -e $'s/123/XXX\nYYY/' file
来自 bash
人:
Words of the form $'string' are treated specially. The word expands
to string, with backslash-escaped characters replaced as specified by
the ANSI C standard
例子
$ sed -e 's/123/XXX\nYYY/' file
abc
XXX\nYYY
edf
但是$'string'
会产生:
$ sed -e $'s/123/XXX\nYYY/' file
abc
XXX
YYY
edf
$ sed 's/123/XXX\'$'\nYYY/' a
abc
XXX
YYY
def
$
在哪里...
$ cat a
abc
123
def
$
它可以使用实际的换行符(使用 GNU Sed 4.2.2 测试):
sed '/123/ {
s/123/XXX
a\YYY
}' < $input_file
这可能对你有用 (GNU sed):
sed '/123/c\XXX\nYYY' file
这使用 c
命令更改与模式匹配的行。
或者如果您更喜欢替换和追加:
sed 's/123/XXX/;T;a\YYY' file
或:
sed -e '/123/{s//XXX/;a\YYY' -e '}' file
或:
sed $'/123/{s//XXX/;a\YYY\n}' file
我想在匹配模式时通过 sed
做两件事:
- 用字符串替换模式
- 在这一行之后追加另一个字符串
比如一个文本文件中的原始内容是:
abc
123
edf
我想将 123
替换为 XXX
并在行后附加 YYY
:
abc
XXX
YYY
edf
我尝试通过 sed '/123/{s/123/XXX;a\YYY\}'
执行此操作,但出现错误:Unmatched "{"
。
命令 a
似乎将其后的所有字符视为 文本以追加 。那么我怎样才能让a
知道追加的文本的结束位置呢?
在 bash
中,这可能是 最简单的 使用 sed
:
sed -e $'s/123/XXX\nYYY/' file
来自 bash
人:
Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard
例子
$ sed -e 's/123/XXX\nYYY/' file
abc
XXX\nYYY
edf
但是$'string'
会产生:
$ sed -e $'s/123/XXX\nYYY/' file
abc
XXX
YYY
edf
$ sed 's/123/XXX\'$'\nYYY/' a
abc
XXX
YYY
def
$
在哪里...
$ cat a
abc
123
def
$
它可以使用实际的换行符(使用 GNU Sed 4.2.2 测试):
sed '/123/ {
s/123/XXX
a\YYY
}' < $input_file
这可能对你有用 (GNU sed):
sed '/123/c\XXX\nYYY' file
这使用 c
命令更改与模式匹配的行。
或者如果您更喜欢替换和追加:
sed 's/123/XXX/;T;a\YYY' file
或:
sed -e '/123/{s//XXX/;a\YYY' -e '}' file
或:
sed $'/123/{s//XXX/;a\YYY\n}' file