我想对用户输入做一些事情以在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
, \0123
1... 序列:
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"
任何状况之下
- 读取一行的语法是
IFS= read -r line
, 不是read line
- 参数扩展必须在 POSIX shell 中引用,例如
bash
。 - 第一个参数
printf
是格式,您不应该在那里有外部数据。
1 请注意,这是echo
一种八进制序列需要前导 0 ( \0ooo
) 的扩展方式,而不是\ooo
C 语言中常见的扩展方式,也可以在 的格式参数中识别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 或以其他方式重复切片。