使用以下语法提供文件:
export 'my_var1=value1' 'my_var2=value2' 'my_var3=value3'
export 'my_var3=value3' 'my_var4=value4'
有什么方法可以按照bash顺序将其拆分以获取变量名称?
my_var1
my_var2
my_var3
我认为首先是按行拆分,然后按空格拆分。但是“值”可以包含空格。我认为关键在于引号。
谢谢。
答案 0 :(得分:3)
Awk对此很有效,并且很容易阅读。
awk -F "export '|' '|'$" '{for(i=1;i<NF;i++){if(split($i,arr,"=")==2)print arr[1]}}' file
说明:
-F "export '|' '|'$"
-三种模式(export '
,' '
,'$
)中的任何一种用于分隔每行。
if(split($i,arr,"=")==2)print arr[1]
-对于每个令牌,用=
分隔,如果有两个令牌,则打印第一个。
编辑:如注释中所指出,需要使'=分隔符并处理该值可以包含两个以上标记的情况:
awk -F "export '|' '|'$" '{for(i=1;i<NF;i++){if(split($i,arr,"\x27=")!=0)print arr[1]}}' file
答案 1 :(得分:0)
这种单线适用于给定的示例:
grep -oP "[^']*(?==)" f|awk '!a[$0]++'
它输出:
my_var1
my_var2
my_var3
my_var4
“值”部分中的空格不是问题。
grep
部分提取变量名称awk
部分消除了重复项。 答案 2 :(得分:0)
您可以让bash做到这一点:
#!/bin/bash
export() { printf '%s\n' "${@%%=*}"; }
source ./yourfile
在这种情况下,它将显示
$ ./myscript
my_var1
my_var2
my_var3
my_var3
my_var4
这样做的好处是export target="$HOSTNAME"
和其他bash语法可以正常工作,尽管显然它也可以运行任何命令替换,因此不能在不受信任的文件上使用。
答案 3 :(得分:0)
可以使用grep的-o
utput和-P
erl选项一步一步完成。
$: grep -Po "(?<=')[[:alnum:]_]+?(?==)" file
my_var1
my_var2
my_var3
my_var3
my_var4
(?<=')
是正向查找,断言该模式在'
之后开始。
[[:alnum:]_]+?
是任何一个或多个([...]
)非贪婪({ {1}})字母数字和/或下划线(+
)。
?
是一个积极的前瞻,要求下一个字符是等号。
根据需要将其插入[:alnum:]_
或(?==)
,以消除重复。