如何用sed/awk调用自定义Bash脚本处理文本?
解决方案
首先确保你的prepend_largest_prime.sh脚本功能正常,以下是一个可工作的版本(包含完整的质数计算逻辑):
#!/bin/bash find_largest_prime() { local n=$1 if (( n < 2 )); then echo 2 return fi for (( i=n; i>=2; i-- )); do local is_prime=1 for (( j=2; j*j<=i; j++ )); do (( i % j == 0 )) && { is_prime=0; break; } done (( is_prime )) && { echo $i; return; } done } input="$1" len=${#input} prime=$(find_largest_prime "$len") echo "${prime} ${input}"
给脚本添加执行权限:
chmod +x prepend_largest_prime.sh
方法1:用awk逐行处理文本
awk天生适合逐行处理任务,通过调用外部脚本并捕获输出实现需求:
awk '{ cmd = "./prepend_largest_prime.sh \"" $0 "\"" cmd | getline output print output close(cmd) # 关闭命令管道避免资源泄漏 }' input.txt
方法2:用sed执行命令替换
sed的e标志可以执行替换后的命令并输出结果,注意引号转义避免参数拆分:
sed -e 's/^/echo "$(./prepend_largest_prime.sh '\''&'\'')"/e' input.txt
你之前用sed失效的常见原因:
- 未使用
e标志:sed默认仅做文本替换,不会执行生成的命令,需要e选项触发执行 - 引号转义错误:直接传递行内容时未正确转义,导致脚本接收的参数被shell拆分,无法处理含空格的文本
内容的提问来源于stack exchange,提问作者gambarimas87
相关产品推荐
相关产品推荐

