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

Ste*_*agg 15 string bash sed extract find

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

abcdefg:12345:67890:abcde:12345:abcde
Run Code Online (Sandbox Code Playgroud)

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

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

Fri*_*ner 16

使用数组的纯Bash:

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

输出:

value = 67890
Run Code Online (Sandbox Code Playgroud)

  • 很确定那是OP要求的...... bash (2认同)

Wil*_*iam 10

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

extractedNum="${testString#*:}"     # Remove through first :
extractedNum="${extractedNum#*:}"   # Remove through second :
extractedNum="${extractedNum%%:*}"  # Remove from next : to end of string
Run Code Online (Sandbox Code Playgroud)

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

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")
Run Code Online (Sandbox Code Playgroud)

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


Miq*_*uel 5

你可以使用cut这种东西.干得好:

VAR=$(echo abcdefg:12345:67890:abcde:12345:abcde |cut -d":" -f3); echo $VAR
Run Code Online (Sandbox Code Playgroud)

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

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