16

菜鸟在这里,对不起,如果重新发布。我正在从文件中提取一个字符串,并以一行结尾,例如:

abcdefg:12345:67890:abcde:12345:abcde

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

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

4

4 回答 4

18

使用数组的纯 Bash:

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

输出:

value = 67890
于 2013-04-09T09:42:04.900 回答
12

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

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

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

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 命令选择第二列并用空格将该值与整行分隔。如果您不需要整行,只需从替换中删除空格+& 并从读取中删除 line 变量。您可以通过更改 \{2\} 位中的数字来选择任何列。(如果要在此处使用变量,请将命令放在双引号中。)

于 2013-04-09T14:01:18.390 回答
6

你可以用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/"
于 2013-04-09T08:47:40.653 回答
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
于 2013-04-09T08:53:13.297 回答