生成不带换行符的 grep 输出

zet*_*tah 10 grep bash

请考虑这个片段:

X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')

如果某些模式条件与任意文本文件中的行匹配,我想将最后一个单词放入变量中

我的问题是变量最后X有 CR 或 LF 或 CRLF,具体取决于我想删除的源文件,因为它会干扰我打算执行的后续操作。
我什至尝试过类似的事情:

X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')

因此期望sed输出受到限制,[A-Za-z]+但 X 变量中仍然存在这些令人讨厌的字节。

我怎样才能摆脱它,而无需使用像看到的是什么字节在结束了太多的代码,xxd那么cut它和类似的并发症?

Arc*_*ege 8

``$()将删除末尾的新行,但要做到这一点编程,使用tr

grep -m1 'some-pattern' some-file | sed -n 's/.* //p' | tr -d '\012\015'
Run Code Online (Sandbox Code Playgroud)

这将从字符串中删除回车符和/或换行符。

可能的问题是您如何输出结果。例如,默认情况下,echo添加一个换行符。您可能想要使用echo -nprintf


Chr*_*own 5

这似乎awk是满足您需求的更好选择,因为这些问题不存在,因为它可以使用字段和记录:

x=$(awk '/some-pattern/ { sub(/\r$/, "") ; printf("%s", $NF) ; exit }' some-file)
Run Code Online (Sandbox Code Playgroud)

替换避免了 CRLF 行结尾的问题。

sub(/\r$/, "")删除尾随 CR(如果存在)。由于awk治疗\n的记录(行)分隔符,你不需要剥离它,因为它是不是在数据被注视。

printf("%s", $NF)打印$NF没有尾随换行符的最后一个字段 ( )(print并且其他一些awk函数默认附加一个换行符)。

exit发生在前两个动作之后——这相当于m1在你的grep命令行中。这确保awk在执行前两个命令后退出——并且由于这些命令是在匹配时发出的,并且 awk 以 FIFO 方式评估数据,这将只打印第一个匹配项。