格式化文本 - 在注释行之前插入换行符

格式化文本 - 在注释行之前插入换行符

我有一些文字需要整理。基本上,在每个注释之前添加一个换行符,以便每两行之间有一个空行。
以下是需要修改的内容示例,供参考:

# 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

相关内容