如何将模式“合并”在一行中?

如何将模式“合并”在一行中?

我正在执行 grep 和 sed,并且得到了我感兴趣的文件的 2 行。如何在以新行字符结尾的单行中获取这些行?
现在我得到:

pattern1  
pattern2  

我想得到pattern1 pattern2 \n

答案1

paste:

{...pipeline...} | paste -d " " - -

也就是说:“从 stdin 读取一行(第一个-),从 stdin 读取另一行(第二个-),然后用空格将它们连接起来”


bash 特定的技术:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

参考:http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile

答案2

我将三个版本不同的方法放在一行

AWK

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

TR

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

还有更多。

答案3

您可以使用 shell 脚本或在命令行中执行此操作,只需将命令的输出放入变量中即可echo

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

答案4

一种简单的方法,将输出通过管道传输到xargs

$ echo -e 'a\nb' | xargs
a b

这仅适用于小输出,因为它受到每个命令行最大字符数的限制。最大值取决于系统,您可以使用 获取该值getconf ARG_MAX

相关内容