How do I extract the word after the first -n whether or not there is a blank space after?
In the example below it would return test-name on both cases. This awk code is working properly only on the first example.
$ echo "a -n test-name -bc d-e -fe -ntest" | awk 'BEGIN{FS="-n *"}{sub(/ .*/,"",$2);print $2}'   SIGINTÂ
test-name
$ echo "a -bc d-e -fe -ntest-name -ntest" | awk 'BEGIN{FS="-n *"}{sub(/ .*/,"",$2);print $2}'
-n could be considered as a classic bash flag, which accepts an argument either -ntest-name or -n test-name. In this case test-name would be the argument.
sed would also be a option.
Could this be done with a one-liner? Thank you.
>Solution :
One awk approach:
$ echo "a -n test-name -bc d-e -fe -ntest" | awk '{line=substr($0,$0~/^-n/ ? 3 : index($0," -n")+3); split(line,a); print a[1]}'
test-name
$ echo "a -bc d-e -fe -ntest-name -ntest" | awk '{line=substr($0,$0~/^-n/ ? 3 : index($0," -n")+3); split(line,a); print a[1]}'
test-name
$ echo "-ntest-name a -bc d-e -fe -ntest" | awk '{line=substr($0,$0~/^-n/ ? 3 : index($0," -n")+3); split(line,a); print a[1]}'
test-name
NOTES:
- could be further modified if there’s an additional delimiter after the value that we need to filter for, eg,
echo "-ntest-name|new_command"orecho "a b -n test-name; next_command"; would need to know the potential set of additional delimiters - assumes the input has a valid
-nto process otherwise this will print everything from the 3rd input character up to the 1st space (eg,echo "test-name"=>st-name; this could be addressed with additional code