AWK如何通过system()调用xclip输出追加内容到指定行?
问题原因
你遇到的异常是system()函数的特性导致的,两个核心点:
system()的返回值是命令的执行退出状态码,不是命令的输出内容:命令执行成功返回值为0,所以你把返回值拼到$0末尾就会多出一个0。system()执行时会直接把命令的标准输出打印到输出流,不会把内容返回给awk处理:xclip -o输出的is sweet自带换行,直接被打印出来单独占了一行,把原第四行内容挤到了下一行。
修正命令
保留system("xclip -o")调用的前提下,修改为如下命令即可实现需求:
awk -i inplace 'NR == 4 { printf "%s ", $0 system("xclip -o | tr -d \"\\n\"") print "" next } 1' data
逻辑说明
- 匹配到第四行时,先用
printf打印原行内容加空格,不自动追加换行 - 调用
system执行xclip -o,同时用tr -d '\n'删掉输出末尾自带的换行,让is sweet直接跟在原行内容后面 - 手动补一个换行完成第四行输出,跳过后续逻辑
- 其他行用
1(awk默认动作即打印当前行)正常输出即可
如果你可以不强制使用system(),更简洁的规范写法是用getline捕获命令输出:
awk -i inplace 'NR == 4 { "xclip -o" | getline suffix sub(/\n$/, "", suffix) $0 = $0 " " suffix } 1' data
内容的提问来源于stack exchange,提问作者Alexander Sofianos
相关产品推荐
相关产品推荐

