如何用sed/awk单行命令提取第一个-n后的单词(支持有无空格)
# 解决方案
1. 使用sed实现单行命令
sed -E 's/^.*?-n[[:space:]]*([^[:space:]]*).*/\1/;t;s/.*//'
逻辑说明:
^.*?-n[[:space:]]*([^[:space:]]*).*:非贪婪匹配开头到第一个-n的内容,接着匹配-n后0个或多个空格,捕获后续直到下一个空格的所有字符(即目标单词),最后匹配剩余内容\1:替换整个字符串为捕获到的目标单词t:如果前面的替换成功,直接退出sed,避免后续操作s/.*//:如果未匹配到-n,清空输出返回空
2. 使用awk实现单行命令
awk 'match($0, /-n[[:space:]]*([^[:space:]]+)/, arr) {print arr[1]; next} {print ""}'
逻辑说明:
match($0, /-n[[:space:]]*([^[:space:]]+)/, arr):匹配第一个-n及其后0个或多个空格,将后续非空格字符捕获到数组arr的第一个元素中- 匹配成功则打印捕获内容并跳过后续处理;未匹配则输出空字符串
# 示例验证
逐个测试给出的输入场景:
- 输入:
echo "a -n test-name -bc d-e -fe -ntest"→ 输出:test-name - 输入:
echo "a -bc d-e -fe -ntest-name -ntest"→ 输出:test-name - 输入:
echo "-ntest-name -ntest"→ 输出:test-name - 输入:
echo " -n test-name -n test-n"→ 输出:test-name - 输入:
echo "-na test-name -n test-n"→ 输出:test-n - 输入:
echo "- n-name -nn test"→ 输出:n - 输入:
echo "-a -e -i -o"→ 输出:(空) - 输入:
echo "-an -en --n foo"→ 输出:(空) - 输入:
echo "-nbar"→ 输出:bar
内容的提问来源于stack exchange,提问作者jmox
相关产品推荐
相关产品推荐

