在一个文件中,我找到了我想要匹配的模式。当我找到它时,然后我在上面插入一行,但我似乎无法做的是获取模式空间并将其附加到我试图插入的行中。像这样:
/xxx/ i\inserting this line and &
希望“&”能像 s 一样打印模式空间
预先问候并感谢克雷
在一个文件中,我找到了我想要匹配的模式。当我找到它时,然后我在上面插入一行,但我似乎无法做的是获取模式空间并将其附加到我试图插入的行中。像这样:
/xxx/ i\inserting this line and &
希望“&”能像 s 一样打印模式空间
预先问候并感谢克雷
这可能对您有用(GNU sed):
sed -er '/.*(xxx).*/s//inserting this line and \1\n&/' file
参考评论:
sed '/public String getFirstName()/s/.*\("[^"]*"\).*/@XmlElement(name=\1)\n&/' file
我认为 sed 无法解决您i
或a
. 您可以通过将结果通过管道传输到第二个 sed 中来做到这一点,或者如果您使用的是 GNU sed,您可以这样做:
sed '/xxx/ s//cat file_to_insert | head -c-1; echo " &"/e' infile
假设您要插入的内容在infile
. 替换的e
标志使用 执行模式空间中的文本/bin/sh
,然后结果替换命令。根据您输入的大小和/bin/sh
链接的内容,这可能效率低下。
这是使用两次 sed 调用的一种方法:
<infile sed '/xxx/i\inserting this line and' | sed 'N; /\nxxx/! {P; D}; s/\n/ /'
我自己也一直在研究解决方案。在这种类似的情况下,我有一条公共课线
public class SomeStatusCode extends AbstractEntity implements Serializable {
我想在上面添加一个 @XmlRootElement 注释。在 .sed 文件中,我有以下内容
/public class [A-Za-z0-9]* .*/ {
h
s/public class \([A-Za-z0-9]*\) .*/\1")/
s/^/@Xml RootElement(name = "/
p
x
}
结果是:
@Entity
@Table(name="SOME_STATUS_CODE")
@Xml RootElement(name = "SomeStatusCode")
public class SomeStatusCode extends AbstractEntity implements Serializable {
所以最后我得到了期望的结果,即在我的行上方插入一行,其中包含该行的内容。(希望这是有道理的?)