用管道输入中的新行替换模式(不是文件而是管道)

用管道输入中的新行替换模式(不是文件而是管道)

我有一个使用 netcat 获得的输入流。输入流不包含任何换行符。相反,应该有 4 个空格换行。所以我需要用换行符替换每次出现的 4 个空格。

我试图使用

netcat xxxx | sed 's/    /\n/g' | myscript.sh

所以我尝试通过 sed 或 awk 进行管道传输,但没有成功。在处理替换之前,这两个命令似乎都在无限期地等待输入流中的换行符。 sed 和 awk 在文件上都能完美工作,但当它们是管道的一部分时则不然。我正在尝试 awk

RS='    '

或者

-F'    '

但也没有成功。 sed 和 awk 似乎都会吞掉所有内容,直到在输入文件中找到真正的换行符,而这种情况永远不会发生。

答案1

是的,你被缓冲杀死了:sed 正在尝试读取线

这可能会有所帮助:

input=""
netcat xxx | while IFS= read -r -d "" -n 1 char; do
    input+=$char
    if [[ $input == *"    " ]]; then
        echo "${input%    }"
        output=""
    fi
done | yourscript.sh

不过,在第二个方面,更好:将输入记录分隔符定义为 4 个空格并打印每条记录(多字符 RS 是 GNU awk 功能)

netcat xxx | gawk -v RS="    " 1 | yourscript.sh

这种永无休止的单行输入可以通过 bash 函数来模拟:

netcat() { while true; do printf '%d    ' $RANDOM; done; }

相关内容