I need to clean up a config file before a source it. I need to remove any lines that have
### and everything after it if line starts with a string.Example config:
# comment
# comment
dog=woof
cat=meow
moose=huuuuu #comment
# comment
### comment
I have this right now
config_params="$(cat ./config_file.conf | grep -v "^#.* | awk -F '=' '{print$1}')"
The problem is line 2, # comment any number of space up to a #. How can I match to remove lines like this?
You may use this awk:
awk -F= 'NF == 2 {sub(/[[:blank:]]*#.*/, ""); print}' file
dog=woof
cat=meow
moose=huuuuu
Or if you want to print only key names then use:
awk -F= 'NF == 2 {sub(/[[:blank:]]*#.*/, ""); print $1}' file
dog
cat
moose
You can use
config_params=$(awk -F'=' '!/^[[:space:]]*#/{print $1}' ./config_file.conf)
See the online demo:
#!/bin/bash
s='# comment
# comment
dog=woof
cat=meow
moose=huuuuu #comment
# comment
### comment'
awk -F'=' '!/^[[:space:]]*#/{print $1}' <<< "$s"
Output:
dog
cat
moose
Here, ^[[:space:]]*# matches start of a string, then zero or more whitespaces, and then a #. The ! negates the regex match result, so only the lines that do not match this pattern are "taken", and then their Field 1 values are only printed.
Here is another working solution by using sed:
config=$(sed -r -e '/^$/d' -e '/^ *#/d' -e 's/^(.+)(#.*)$/\1/' [[YOUR_CONFIG_FILE_NAME]])