
grep
代わりに.likeに表示するユーザー入力で何かをしたいと思います。
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'
末尾の改行は削除されるため、改行$(...)
で終わるテキストを入力するために使用することはできません。
2行を読むには2回呼び出すだけですread
。
IFS= read -r first
IFS= read -r second
printf 'You entered: <%s\n%s>\n' "$first" "$second"
行を入力して展開するには\n
、、、、 1...の順番\a
に従います。\x45
\0123
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行を読む構文は次のとおりです。
IFS= read -r line
、いいえread line
- パラメータ拡張はPOSIXシェルから引用する必要があります。
bash
。 - 最初のパラメータ
printf
は形式です。これには外部データがあってはいけません。
1これは、Cの一般的な拡張ではなく、echo
8進数シーケンスに先行する0()が必要な\0ooo
拡張\ooo
であり、形式パラメータでも認識されますprintf
。
答え2
bashスクリプト1行で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、または繰り返し分割できます。