在bash中分割导出格式

时间:2019-03-12 15:58:59

标签: bash

使用以下语法提供文件:

export 'my_var1=value1' 'my_var2=value2' 'my_var3=value3'
export 'my_var3=value3' 'my_var4=value4'

有什么方法可以按照bash顺序将其拆分以获取变量名称?

my_var1
my_var2 
my_var3

我认为首先是按行拆分,然后按空格拆分。但是“值”可以包含空格。我认为关键在于引号。

谢谢。

4 个答案:

答案 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:]_(?==),以消除重复。