
コマンドラインからユーザー入力を取得できることがわかりました。ところで、私が入力した改行文字を認識しません。行為:
#!/bin/bash
read -e -p "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
- 入力すると
'multi\nline'
出力Multiline input=
printf
'variable=multinline'
- 入力すると
'multi\\nline'
出力Multiline input=
printf
'variable=multi\nline'
printf
読み取った新しい行read -p
、つまり出力をどのように印刷しますか?
multi line
代わりにmultinline
またはmulti\nline
?
関連質問:
答え1
入力\n
(たとえば、2文字\
の合計n
)が許可されている場合は、次のようにprintf
解釈できます。
#!/bin/bash
IFS= read -rep "Multiline input=" variable;
printf -v variable "%b" "$variable"
printf "'variable=%s'\n" "${variable}";
たとえば、
~ ./foo.sh
Multiline input=foo\nbar
'variable=foo
bar'
~からバッシュマニュアル:
バックスラッシュ文字「\」を使用すると、次の文字の読み取りと行の連続の特別な意味を削除できます。
「行連続」ビットは、行区切り文字で他の文字を使用しない限り、改行をエスケープできないことを意味するようです。
答え2
@muruは正しいbashの答えを持っています。
別のオプション:バックスラッシュシーケンスを処理しますが、入力文字printf
に注意する必要があります。%
read -r input
printf "${input//%/%%}\n"
答え3
orの機能の一部を使用する代わりに、bash
エスケープされた改行文字を実際の改行文字に置き換えました。printf
sed
\\n
#!/bin/bash
read -e -p -r "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
variable=$(printf "${variable}" | sed 's/\\n/\n/g');
引用:
- https://stackoverflow.com/questions/52065016/how-to-replace-n-string-with-a-new-line-in-unix-bash-script
- https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed
- https://stackoverflow.com/questions/10748453/replace-comma-with-newline-in-sed-on-macos
- sedは改行文字を置き換えることができますか?