如何捕获用户输入中的换行符

如何捕获用户输入中的换行符

我想对用户输入做一些事情以在grep.喜欢,而不是

uin="first\nsecond\n"
printf $uin | grep d

哪个输出second,我想让用户输入它,比如

read uin

用户可以在其中输入"first\nsecond\n".然后可以在grep上面的行中使用该变量。或者,如果用户可以在输入first和后输入实际回报second,则将填写该回报,因为\n这也可以。这意味着从 cli 运行。谢谢。

答案1

你可以这样做:

echo>&2 "Please enter a multiline string, Ctrl-D, twice if not on an empty line to end:"
input=$(cat)
printf 'You entered: <%s>\n'

请注意,$(...)会删除所有尾随换行符,因此不能用于输入以换行符结尾的文本。

要读取两行,只需调用read两次:

IFS= read -r first
IFS= read -r second
printf 'You entered: <%s\n%s>\n' "$first" "$second"

要输入一行并在其中展开\n, \a, \x45, \01231... 序列:

IFS= read -r line
expanded_line=$(printf %b "$line")
printf 'You entered: <%s>\n' "$expanded_line"

或者使用bash/zsh或 ksh93u+m 的最新版本,避免删除尾随换行符:

IFS= read -r line
printf -v expanded_line %b "$line"
printf 'You entered: <%s>\n' "$expanded_line"

任何状况之下


1 请注意,这是echo一种八进制序列需要前导 0 ( \0ooo) 的扩展方式,而不是\oooC 语言中常见的扩展方式,也可以在 的格式参数中识别printf

答案2

一行 bash 脚本就grep d足够了。它将读取标准输入,直到用户输入 ctrl-D 的最后一行。

或者放入cat脚本中:

#! /usr/bin/env bash

PATTERN=${1:-d}
TMP=/tmp/user_input.txt

cat > ${TMP}

grep "${PATTERN}" ${TMP}

rm ${TMP}

然后,您可以对输入进行排序、awk 或以其他方式重复切片。

相关内容