我正在从包含多行的先前声明的变量中将输入传递给grep。我的目标是仅提取某些行。 随着我在grep中增加参数数量,可读性下降。
var1="
_id=1234
_type=document
date_found=988657890
whateverelse=1211121212"
echo "$var1"
_id=1234
_type=document
date_found=988657890
whateverelse=1211121212
grep -e 'file1\|^_id=\|_type\|date_found\|whateverelse' <<< $var1
_id=1234
_type=document
date_found=988657890
whateverelse=1211121212
我的想法是从数组传递参数,这将提高可读性:
declare -a grep_array=(
"^_id=\|"
"_type\|"
"date_found\|"
"whateverelse"
)
echo ${grep_array[@]}
^_id=\| _type\| date_found\| whateverelse
grep -e '${grep_array[@]}' <<<$var1
---- no results
我该如何使用grep从其他地方而不是一行传递具有多个OR条件的参数? 随着更多的论据,可读性和可管理性下降。
答案 0 :(得分:1)
您的想法是正确的,但是在逻辑上您有几个问题。类型${array[@]}
的数组扩展将数组的内容作为单独的单词放置,并用空格字符分隔。当您想将单个正则表达式字符串传递给grep
时,shell将数组扩展为其组成部分,并尝试将其评估为
grep -e '^_id=\|' '_type\|' 'date_found\|' whateverelse
,这意味着您现在将每个正则表达式字符串而不是正则表达式字符串都视为文件内容。
因此,为了使grep
将整个数组内容视为单个字符串,请使用${array[*]}
扩展。由于这种特殊类型的扩展使用IFS
字符来加入数组内容,因此如果未重置,则会在单词之间获得默认的空格(默认IFS
值)。下面的语法在子外壳中重置IFS
值并打印出扩展的数组内容
grep -e "$(IFS=; printf '%s' "${grep_array[*]}")" <<<"$str1"