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)
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 \}位中的数字来选择任何列.(如果要在那里使用变量,请将命令放在双引号中.)
你可以使用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)