如何在sed的w命令中反向引用文件名?
解决sed动态指定w命令文件名的问题
问题原因
sed的w命令后的文件名是静态解析的——sed启动时就会把&当作字面文件名创建,不会在替换操作中将其解析为匹配到的内容,这就是你原命令生成&文件的原因。
可行方案
方案1:sed生成shell命令后执行
通过sed将输入行转换为对应的shell写入命令,再交给bash执行:
echo 'abc123' | sed -n 's/^\(abc\)\(.*\)/echo "\2" > "\1"/p' | bash
- 解析:
\1捕获前缀abc作为文件名,\2捕获剩余内容123作为要写入的文本;sed生成echo "123" > "abc"命令,由bash执行完成写入。
方案2:使用GNU sed的e扩展命令
如果你的环境是GNU sed,可以直接用e命令执行替换后的shell命令,无需额外管道:
echo 'abc123' | sed -n 's/^\(abc\)\(.*\)/echo "\2" > "\1"/e'
e命令会将替换后的结果作为shell命令直接执行,一步完成解析文件名、写入内容的操作。
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

