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