【发布时间】:2014-10-18 22:53:48
【问题描述】:
我目前需要在文本文件的一行中提取第二个单词 (CRISTOBAL)。
* CRISTOBAL AL042014 08/05/14 12 UTC *
“CRISTOBAL”行中的第二个单词每天都会有所不同,所以我只需要找到一种方法来提取该行中的第二个单词/字符。
【问题讨论】:
-
你需要哪个 - 单词或字符?
我目前需要在文本文件的一行中提取第二个单词 (CRISTOBAL)。
* CRISTOBAL AL042014 08/05/14 12 UTC *
“CRISTOBAL”行中的第二个单词每天都会有所不同,所以我只需要找到一种方法来提取该行中的第二个单词/字符。
【问题讨论】:
第二个字
echo '* CRISTOBAL AL042014 08/05/14 12 UTC *' | awk '{print $2}'
会给你CRISTOBAL
echo 'testing only' | awk '{print $2}'
会给你only
如果行的结构发生变化,您可能需要修改它。
文本文件中各行的第二个单词
如果你的文本文件包含以下两句
this is a test
* CRISTOBAL AL042014 08/05/14 12 UTC *
运行 awk '{print $2}' filename.txt 将返回
is
CRISTOBAL
第二个字符
echo 'testing only' | cut -c 2
这将为您提供e,这是第二个字符,您可能还需要修改它以满足您的需要。
【讨论】:
在需要 sed 的情况下/仅可用
sed '^ *[^ ]* *\([^ ]*\) .*/\1/' YourFile
取第二个非空白组(假设单词后至少有 1 个空格
但我更喜欢 cut 以提高速度(如果需要任何操作,我更喜欢 awk)。
实际上它主要取决于脚本中的下一个动作(如果有的话)。
【讨论】:
我知道它已经过时了,但是 @NeronLeVelu 的头发短了我在管道中需要的东西。
ip link show wlan0 | grep 'link'| sed 's/^ *[^ ]* *\([^ ]*\) .*/\1/'
是我用来提取 MAC 地址的。由于其他原因,我无法使用 awk。
【讨论】:
您可以使用 shell 内置命令:
#!/bin/sh
set -f && set +f -- * CRISTOBAL AL042014 08/05/14 12 UTC *
echo $2
或使用别名更好地阅读:
#!/bin/sh
alias explode='set -f;set +f --'
LINE='* CRISTOBAL AL042014 08/05/14 12 UTC *'
explode $LINE
echo $2
“-f”表示:
禁用文件名生成(通配符),
所以星号不会扩展为文件名。
一次关闭和打开它会再次设置默认值。
这适用于所有 POSIX shell。
【讨论】: