如何用 3 行替换行/在找到之前添加 2 行/在末尾的 1 行之前添加 2 行

如何用 3 行替换行/在找到之前添加 2 行/在末尾的 1 行之前添加 2 行

文件为:

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
exit 0

需要将这些行逐行排列:

echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

所以它看起来像这样:

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch
exit 0

问题-命令内嵌命令,命令内嵌多行\n

现在我有命令,sed -i 's/exit 0/echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0/gp' /usr/file但是其中有些错误 - 它不起作用。

更新 1

“斜线”/\/:我找到了使用斜线\/和反斜线的解决方案\\

所以现在我的命令有效sed -i 's/exit 0/echo deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

但是它需要修改,因为现在它可以找到所有表达式,但是如何才能找到没有其他内容的行呢?所以它不会替换exit 0示例文件注释中的内容。

更新 2

至少以^: 开头的行可以为此文件找到解决方案sed 's/^exit 0/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file,但是如果文本文件包含以下行:

exit 0
exit 0 means exiting

然后不能用来^查找以表达式开头的行。

所以最好的方法是,我找不到如何找到仅包含表达式的精确行或找到表达式行而不是所有表达式?

更新 3

精确线^& $:调整^限制左侧没有任何东西,$右侧也没有任何东西,因此现在 1 的解决方案是sed -i 's/^exit 0$/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

我想学习至少 3 种使用一行命令的方法。如何:

  1. 用 3 行包含上述命令的符号替换找到的行
  2. 找到完整的行,而不仅仅是表达式,并在找到之前添加 2 行
  3. 添加 2 行 在结束前 1 行

答案1

这些可能对你有用(它们都实现相同的目的!):

 sed '/^exit 0/i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

搜索行首exit 0并插入 2 行。

或者:

 sed '$i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

在文件最后一行之前插入 2 行。

或者:

 sed '$c\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0' file

将文件最后一行更改为 3 行。

答案2

对于问题 3:我假设您想在文件的最后一行和倒数第二行之间添加一些文本。此外,此文本由 2 行组成,但这并不重要。head -n -1将提取除最后一行之外的所有内容,并将tail -n 1提取最后一行。因此可以这样做

head -n -1 file > outputfile
cat file_with_two_line_text >> outputfile
tail -n 1 file >> outputfile

这不是很有效,因为它要扫描“文件”两次,而通常只需扫描一次。

相关内容