ubuntu 如何让grep在bash变量中使用换行符

vsaztqbk  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(133)

我想使用grep来过滤bash变量中定义的一些行。

    • 如果变量定义在“$(cat)”内,则结果正确:**
test_string=$(cat <<END
hello
world
test
bar hello
END
)

echo -e "$test_string"

filter_string="$(grep "hello" <<< "$test_string")"

echo -e "$filter_string"
    • 正确输出如下:**
# test_string=$(cat <<END
hello
world
test
bar hello
END
)
# echo -e "$test_string"
hello
world
test
bar hello
# filter_string="$(grep "hello" <<< "$test_string")"
# echo -e "$filter_string"
hello
bar hello
#
    • 但如果定义了变量"\n"(使用脚本将许多其他字符串连接到一个多行变量中),grep将无法正常工作:**
test_string="hello\nworld\ntest\nbar hello"

echo -e "$test_string"

filter_string="$(grep "hello" <<< "$test_string")"

echo -e "$filter_string"
    • 这里是错误的输出:**
# test_string="hello\nworld\ntest\nbar hello"
# echo -e "$test_string"
hello
world
test
bar hello
# filter_string="$(grep "hello" <<< "$test_string")"
# echo -e "$filter_string"
hello
world
test
bar hello
#

如何使grep find命令与变量中的“\n”一起工作?

    • 更新:**
    • 创建多行变量的代码如下:**
test_string="hello"
test_string="${test_string}\nworld"
test_string="${test_string}\ntest"
test_string="${test_string}\nbar hello"
    • test_string的内容是动态的,通过加入其他来源的其他单词。**
    • 更新2:用\n连接两个字符串变量:**
other_string="world"

test_string="hello"
test_string+=$'\n${other_string}'
test_string+=$'\ntest'
test_string+=$'\nbar hello'

echo "$test_string"
    • 输出如下:**
hello
${other_string}
test
bar hello
yqkkidmi

yqkkidmi1#

当你声明一个变量为test_string="hello\nworld\ntest\nbar hello"时,它在声明变量中存储的是文字\n,而不是换行符。
使用printf声明一个嵌入了\n的变量,如下所示:

printf -v test_string '%b\n' "hello\nworld\ntest\nbar hello"

或者在bash中使用$'...'指令:

test_string=$'hello\nworld\ntest\nbar hello'

然后使用grep

filter_string="$(grep "hello" <<< "$test_string")"

# check variable content
declare -p filter_string

输出:

declare -- filter_string="hello
bar hello"

更新答案:

test_string="hello"
test_string+=$'\nworld'
test_string+=$'\ntest'
test_string+=$'\nbar hello'

echo "$test_string"

echo '---- output ---'
filter_string="$(grep "hello" <<< "$test_string")"
# check variable content
echo "$filter_string"

输出:

hello
world
test
bar hello
---- output ---
hello
bar hello
rks48beu

rks48beu2#

试试这样:

test_string="
hello
world
test
bar hello
"

$ grep hello <<< $test_string 
hello
bar hello

相关问题