我有一个文件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
您的模式应该仅匹配以( )^>.*
开头的行并匹配该行 ( ) 中的其他所有内容。所以:>
^>
.*
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'