![格式化文本 - 在注释行之前插入换行符](https://linux22.com/image/119851/%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%96%87%E6%9C%AC%20-%20%E5%9C%A8%E6%B3%A8%E9%87%8A%E8%A1%8C%E4%B9%8B%E5%89%8D%E6%8F%92%E5%85%A5%E6%8D%A2%E8%A1%8C%E7%AC%A6.png)
我有一些文字需要整理。基本上,在每个注释之前添加一个换行符,以便每两行之间有一个空行。
以下是需要修改的内容示例,供参考:
# quickly backup or copy a file with bash
cp filename{,.bak}
# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x e
# Copy ssh keys to user@host to enable password-less ssh logins.
$ssh-copy-id user@host
# Empty a file
> file.txt
# Execute a command without saving it in the history
<space>command
# Capture video of a linux desktop
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
# Salvage a borked terminal
reset
# start a tunnel from some machine's port 80 to your local post 2001
ssh -N -L2001:localhost:80 somemachine
# Execute a command at a given time
echo "ls -l" | at midnight
# Query Wikipedia via console over DNS
dig +short txt <keyword>.wp.dg.cx
# currently mounted filesystems in nice layout
mount | column -t
# Update twitter via curl
curl -u user:pass -d status="Tweeting from the shell" http://twitter.com/statuse
s/update.xml
# Place the argument of the most recent command on the shell
'ALT+.' or '<ESC> .'
# output your microphone to a remote computer's speaker
dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp
我希望它看起来像这样:
# quickly backup or copy a file with bash
cp filename{,.bak}
# Rapidly invoke an editor to write a long, complex, or tricky command
ctrl-x e
# Copy ssh keys to user@host to enable password-less ssh logins.
$ssh-copy-id user@host
# Empty a file
> file.txt
# Execute a command without saving it in the history
<space>command
# Capture video of a linux desktop
ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
# Salvage a borked terminal
reset
我尝试使用 OSXsed
来使格式正确,但无济于事:
sed 's/^\#/\n&/g' <filename.txt>
awk
如果这是解决问题的更好方法,我并不反对使用。
答案1
awk '{if (/^#/) {if (!n++ && NR>1) print ""} else n=0; print}'
会在以 开头的行序列中的第一行之前插入一个空行#
。所以对于这样的输入:
xx
#1
#2
yy
给出:
xx
#1
#2
yy
n
计算注释行组中的注释行数。print ""
如果我们位于每组注释行的第一行(并使用 排除第一行输入) ,我们将打印一个空行 ( ) NR>1
。
答案2
正确的sed
是
sed '2,$s/^#/\n#/' filename
这将添加一个换行符仅有的在这几行之前开始并发表评论。
指示从文件的第二行2,$
到sed
最后一行开始计算。在替换命令中s
,我们正在查找以注释符号 ( ^#
) 开头的行,并用换行符和我们找到的注释符号 ( \n#
) 替换行中出现的这一处。
您不需要g
命令末尾的选项,因为您不想替换#
一行中找到的每个选项。
这仅适用于 GNU sed
,因为\n
替换字符串在标准中未定义。但你可以做
sed '1n;/^#/{x;p;x;}' filename
反而。打印1n
出第一行并继续下一行。这样我们就可以避免第 2 行直到结束为止的“寻址”。因此,现在我们可以处理以 和 开头的所有行,#
其中{}
执行的所有内容都已执行:x
交换模式空间和保存空间的内容。保留空间为空,因此p
打印空行,第二个x
将缓冲区更改回来,因此保留空间再次为空,并且默认情况下打印原始行。
答案3
也可以使用分支仅在每个注释块的第一行之前添加换行符sed
:
sed -n '1{p;d}; /^#/{s/^/\n/;:x;p;n;/^#/bx}; /^#/!p' filename
这里:
1{p;d}
避免在第一行之前添加新行。/^#/{s/^/\n/;:x;p;n;/^#/bx}
就是在每块注释之前添加一个新行。以下是它的作用的详细说明:/^#/
匹配以 开头的行#
。对于这些行,sed
将执行大括号内的命令块。s/^/\n/
在匹配的行之前添加换行符。:x;p;n;/^#/bx
定义一个标签x
,打印模式空间 (p
),用下一行输入替换模式空间 ( ),如果新模式空间是注释则n
返回( )。x
/^#/bx
/^#/!p
通常打印不是注释的行。
编辑:您还可以使命令无效,如下所示:
sed -n '1{p;d}; /^\s*$/bx; /^#/{s/^/\n/;:x;p;n;/^#/bx}; /^#/!p' filename