将字符串的一部分提取到bash中的变量

时间:2013-04-09 08:45:43

标签: string bash sed find extract

noob在这里,对不起,如果重新发布。我从文件中提取一个字符串,最后得到一行,如:

abcdefg:12345:67890:abcde:12345:abcde

让我们说它在一个名为testString的变量中 冒号之间的值的长度不是恒定的,但是我想将数字(因为字符串很好)保存到第2和第3个冒号之间的变量。所以在这种情况下,我最终得到了我的新变量,我们称之为extractNum,为67890。我假设我必须使用sed但从未使用它并试图绕过它... 有人可以帮忙吗?干杯

在旁注中,我使用find从字符串中提取整行,通过搜索第一个字符串,在本例中为abcdefg部分。

4 个答案:

答案 0 :(得分:16)

使用数组的纯Bash:

testString="abcdefg:12345:67890:abcde:12345:abcde"
IFS=':'
array=( $testString )
echo "value = ${array[2]}"

输出:

value = 67890

答案 1 :(得分:10)

这是另一种纯粹的bash方式。当您的输入相当一致并且您在选择的部分中不需要太多灵活性时,工作正常。

extractedNum="${testString#*:}"     # Remove through first :
extractedNum="${extractedNum#*:}"   # Remove through second :
extractedNum="${extractedNum%%:*}"  # Remove from next : to end of string

您还可以在读取文件时过滤文件,例如:

while IFS=' ' read -r col line ; do
    # col has the column you wanted, line has the whole line
    # # #
done < <(sed -e 's/\([^:]*:\)\{2\}\([^:]*\).*/\2 &/' "yourfile")

sed命令正在挑选第二列并使用空格从整行中分隔该值。如果您不需要整行,只需删除空格+&amp;从替换中删除读取的行变量。您可以通过更改\ {2 \}位中的数字来选择任何列。 (如果要在那里使用变量,请将命令放在双引号中。)

答案 2 :(得分:5)

您可以将cut用于此类内容。你走了:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR

为了它的乐趣,这就是我(不)用sed做到这一点的方式,但我确信有更简单的方法。我想这对我未来的读者来说是个问题;)

echo abcdefg:12345:67890:abcde:12345:abcde |sed -e "s/[^:]*:[^:]*:\([^:]*\):.*/\1/"

答案 3 :(得分:2)

这应该对你有用:关键部分是awk -F: '$0=$3'

NewVar=$(getTheLineSomehow...|awk -F: '$0=$3')

示例:

kent$  newVar=$(echo "abcdefg:12345:67890:abcde:12345:abcde"|awk -F: '$0=$3')

kent$  echo $newVar 
67890

如果您的文字存储在var testString中,您可以:

kent$  echo $testString                                                                                                                                                     
abcdefg:12345:67890:abcde:12345:abcde
kent$  newVar=$(awk -F: '$0=$3' <<<"$testString")
kent$  echo $newVar                                                                                                                                                         
67890