如何使用sed提取文件指定行首个单词及向sed传递bash变量
提取第n行首个单词的实现方法
你现有的sed逻辑已经非常接近目标,只需要补充行号匹配规则和关闭默认输出即可:行号直接写在替换规则前就能限定仅处理目标行,搭配-n参数关闭sed默认的全量输出,仅打印处理后的目标行结果。
以提取第1行首个单词为例,命令如下:
sed -n '1 s/\s.*//p' wishlist.txt
参数说明:
-n:关闭sed默认的每行输出逻辑1:限定仅处理第1行,可替换为你需要的任意行号ns/\s.*//:将第一个空白符之后的所有内容替换为空,保留首个单词p:打印处理后的当前行内容
如果偏好更直观的写法,用awk实现会更简洁,天然支持按空白分割字段,直接匹配行号输出第一个字段即可:
awk 'NR==1{print $1;exit}' wishlist.txt
NR是awk内置的行号变量,匹配到目标行后输出第一个字段$1,加exit可以提前终止文件读取,大文件场景下效率更高。
向sed传递bash变量的正确方法
你写的两条命令报错核心有两个原因:
- 单引号包裹的sed表达式中,bash变量不会被展开,
'$is/ .*//p'里的$i会被sed当做普通字符串处理,不会替换为实际的变量值 - 第二条命令里多余的反引号会触发命令替换,把变量
$i的值当做系统命令执行,属于语法错误
正确的写法是用双引号包裹sed表达式,双引号内的bash变量会正常展开,同时不需要加额外的反引号:
# 变量赋值示例 i=1 wishlist="wishlist.txt" # 正确的传参写法 sed -n "${i}s/\s.*//p" "$wishlist"
注意如果变量内容包含空格或特殊字符,给变量加双引号包裹可以避免参数拆分错误。
内容的提问来源于stack exchange,提问作者definitiv
相关产品推荐
相关产品推荐

