我需要根据长字符串中的某些值获取字符串的一部分(例如ps -ef的某些输出)。
例如源字符串:
long_string1="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc."
或
long_string2="cmd ... -aaaa=A -DHOME=/home/user/xxx -bbbb=B -zzzz=Z -cccc=C ... etc."
我想在 -DHOME = 之后提取或获取以下子字符串:
/home/user/xxx
" -DHOME = "的位置不是固定的,它可以在long_string中的任何地方。
我正在使用以下命令:
echo $long_string1|sed -e 's/.*-DHOME=//g;s/ -cccc=C.*//g'
它适用于$ long_string1,但它对$ long_string2不起作用。
仅当" -cccc = C " netx将是" -DHOME = " : - (
如何在" -DHOME = "之后获得路径?但不依赖于下一个值,例如"的 -cccc = C " ???
有没有更有效的方法或正则表达式来获得相同的输出?
由于 M.Gi
答案 0 :(得分:1)
awk
和cut
可以为您提供帮助。
#!/bin/bash
get_home() { awk -F "DHOME=" '{print $2}' <<< "${long_string}" | cut -d ' ' -f1; }
long_string="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc."
get_home
long_string="cmd ... -aaaa=A -DHOME=/home/user/xxx -bbbb=B -zzzz=Z -cccc=C ... etc."
get_home
long_string="cmd ... -aaaa=A -DHOME=/home/user/xxx"
get_home
输出
/home/user/xxx
/home/user/xxx
/home/user/xxx
awk
将输入拆分为“DHOME =”并打印第二部分
cut
然后拆分空格并获得第一部分。显然,如果文件夹的名称包含空格,则无法正常工作。通常,主目录的名称中没有空格。
答案 1 :(得分:1)
纯粹bash风格的解决方案,为shelter
提供建议。
#!/bin/bash
long_string="cmd ... -aaaa=A -bbbb=B -zzzz=Z -DHOME=/home/user/xxx -cccc=C ... etc."
tempString1="${long_string##*-DHOME=}" # Strips off everything upto '-DHOME='
tempString2="${tempString1/ *}" # Strips off everything until first whitespace
echo "$tempString2"
在控制台中运行: -
$ ./myScript.sh
/home/user/xxx