noob在这里,对不起,如果重新发布。我从文件中提取一个字符串,最后得到一行,如:
abcdefg:12345:67890:abcde:12345:abcde
让我们说它在一个名为testString的变量中 冒号之间的值的长度不是恒定的,但是我想将数字(因为字符串很好)保存到第2和第3个冒号之间的变量。所以在这种情况下,我最终得到了我的新变量,我们称之为extractNum,为67890。我假设我必须使用sed但从未使用它并试图绕过它... 有人可以帮忙吗?干杯
在旁注中,我使用find从字符串中提取整行,通过搜索第一个字符串,在本例中为abcdefg部分。
答案 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