Gau*_*tam 7 sed awk text-processing ed
我想在最后一行之前的两行中插入一个新行。所以如果我的原始文件是:
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
结果应该是
1
2
3
New line
4
5
Run Code Online (Sandbox Code Playgroud)
Kus*_*nda 14
使用ed:
$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5
Run Code Online (Sandbox Code Playgroud)
该ed编辑脚本:
$-1i
New line
.
,p
Run Code Online (Sandbox Code Playgroud)
这首先移动到从末尾 ( $-1)向上一行的行,并i在该行上方插入 ( ) 新内容。插入的内容以单点结束(允许多行)。最后,p在终端上显示完整的修改缓冲区。
您可以将其重定向到一个新文件,或者您可以使用
printf '$-1i\nNew line\n.\nw\n' | ed -s file
Run Code Online (Sandbox Code Playgroud)
(,p更改为w)。
后者也是您类似地ex用于此工作的方式:
printf '$-1i\nNew line\n.\nw\n' | ex -s file
Run Code Online (Sandbox Code Playgroud)
ed并且ex是标准的面向行的编辑器(与全屏编辑器相反),应该随您的系统一起提供。请注意,这-s对每个人意味着不同的事情,但在执行此类批处理模式编辑任务时适用于两者。
进一步阅读:
head它可以通过简单的和来完成tail:
$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的,它会吃掉任何尾随的空白行。因此,为了保留尾随空白行,
$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file
Run Code Online (Sandbox Code Playgroud)
或单线
$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file
Run Code Online (Sandbox Code Playgroud)
sed你也可以使用 GNU :
sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile
Run Code Online (Sandbox Code Playgroud)
在文件的倒数第三行插入一行New-line(在最后一行之前插入一行)。
这与 ewline 后跟除 ewline 之外的任何内容(\n[^\n]*){3}$相匹配,并且从文件末尾开始最多 3 次,其中选项sed将文件读取为单行(用 NUL 字符分隔行)。所以它只会在下面匹配(在我突出显示的星号之间):\n\n-z
3*\n
4\n
5\n*
Run Code Online (Sandbox Code Playgroud)
可移植性,你会使用:
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile
Run Code Online (Sandbox Code Playgroud)
如果您仍然sed无法处理\n替换部分中的换行符,您可以使用实际的换行符或按Ctrl+V后跟Enter将打印^M回车键的控制字符:
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile
Run Code Online (Sandbox Code Playgroud)
将sedN读取的每一行追加到模式空间,然后添加新行,直到读取所有行。定义一个标签并告诉sed跳转到调用的标签,只要它不是文件末尾。:t$!btt