如何用 sed 将包含字符的行替换为存储在变量中的文本?

如何用 sed 将包含字符的行替换为存储在变量中的文本?

我有一个文件entry.txt,其文本如下

$ cat entry.txt 
>Main entry
This is some text to try
how to substitute the first
line of the text.

我想通过搜索字符来替换第一行>并添加一些存储在变量中的文本:

$ var=TITLE
$ sed -i "s/>*/$var/" entry.txt 
$ cat entry.txt 
TITLEMain entry
TITLEThis is some text to try
TITLEhow to substitute the first
TITLEline of the text.

我怎么能够

  1. >替换包含且不>单独的整行

  2. 只替换第一行而不替换其他行?

谢谢。

答案1

您的模式应该仅匹配以( )^>.*开头的行并匹配该行 ( ) 中的其他所有内容。所以:>^>.*

sed -i "s/^>.*/$var/" entry.txt

答案2

如果您提供了预期的输出,那将会很有帮助,尽管我想我可以猜测您想要的大部分内容。您的测试用例仅解决替换“>”的要求,而不是第一行约束。它也没有解决“>”不是行中第一个字符的情况。使用“-e”(将标准输入更改为标准输出)而不是“-i”(就地编辑文件)测试 sed 更容易。

也许我们尝试不同的测试用例:

>Main entry>
This is some text to try
>how to substitute the first
line of the text.

sed -i "s/>*/$var/" 条目.txt

这里的模式表示匹配零个或多个“>”实例,但您确实希望匹配至少一个实例。您打算如何处理多个实例?是否应该仅在行的开头进行匹配?)

var=INJECT
sed -e "s/.*>.*/$var/" <entry.txt
INJECT
This is some text to try
INJECT
line of the text.

这看起来好一点了。

但是要让 sed 到仅有的改变第一行要困难得多。使用 Gnu sed,这是可能的:

sed -e "0,/.*>.*/s//$var/" <entry.txt
INJECT
This is some text to try
>how to substitute the first
line of the text.

这是大概在传统的 sed 中可以通过其他方式实现,但我已经放弃并使用 awk 来实现这一点。

答案3

使用awk

如果我们想更改第一条记录(如果>出现在记录开始处),则可以使用以下内容:

$ awk -v var="$var" '/^>/ && NR==1{$0 = var}1'

如果我们想更改>出现在行开头的第一个实例的第一行,则可以使用以下命令:

$ awk -v var="$var" '/^>/ && !a{$0 = var; a++}1'

相关内容