我从教科书上看到了这段代码;这本书只说这1,/^[ ]*$/d
意味着“从第 1 行删除,直到第一个空白行”。每个字符的具体含义是什么?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
我从教科书上看到了这段代码;这本书只说这1,/^[ ]*$/d
意味着“从第 1 行删除,直到第一个空白行”。每个字符的具体含义是什么?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
1,/.../
表示从第一行到与 . 之间的模式匹配的行的范围/
。/^[ ]*$/
[ ]*
匹配从行首到行^
尾包含 0 或任意数量的空格$
的行。目前尚不清楚问题中的代码是否是故意的,以及它是否是书中的精确副本。单个空格周围的括号不是必需的。也许原作者想在括号之间有一个空格和一个制表符,可以用字符类替换
[[:blank:]]
。d
是删除行的命令w
写文件q
退出编辑器这些命令
ed
通过此处的文档发送到,由<< EOF
. 该EOF
字符串是与其他EOF
四行配对的半任意名称。不加EOF
引号意味着中间行中的任何变量都将被扩展。这里要注意的另一件事是示例的 unquoted
$1
。命令/脚本将ed
针对第一个位置参数(脚本或函数的参数)执行进一步的空格分割和文件名生成。这个论点确实应该被引用。如需进一步阅读,请参阅为什么我的 shell 脚本会因空格或其他特殊字符而窒息?和忘记在 bash/POSIX shells 中引用变量的安全隐患。命令和输入
是要编辑的
$1
文件名,EOF 之间的所有内容都是ed
.逐个描述
1,/^[ ]*$/d
1,
从行开始1
,在这种情况下继续直到第一次出现搜索字符串/
表示我们将要搜索一个字符串^
表示我们要匹配文件中的行首[
表示我们即将指定许多字符' 我们想匹配一个空格 - 通常这里会有更多的字符
]
完成指定字符*
我们要匹配 0 个或多个空格(或 之间的任何字符[]
)$
直到文件中的行尾/
关闭搜索d
删除该行然后下一行
w
写入更改,并q
退出ed
。影响
如果文件的 (
$1
) 第一行是空的或只有空格(没有制表符),那么它将被删除。