2015-09-23 40 views
0

我是新来打坏脚本新的变量分配,我正在学习命令的工作,我在这个问题上跌倒,检索字符之间字符串,用awk在bash

我有一个文件/home/fedora/file.txt

里面的文件是这样的:

[apple] This is a fruit. 
[ball] This is a sport's equipment. 
[cat] This is an animal. 

我想什么是“[”和“]”之间的检索词。

我试过到目前为止:

while IFS='' read -r line || [[ -n "$line" ]]; 
do 
    echo $line | awk -F"[" '{print$2}' | awk -F"]" '{print$1}' 
done < /home/fedora/file.txt 

我可以打印 “[” 和 “]” 之间的话。

然后我想把回声的单词放到一个变量中,但我不知道如何去做。

任何帮助,我将不胜感激。

回答

0

尝试这种情况:

variable="$(echo $line | awk -F"[" '{print$2}' | awk -F"]" '{print$1}')" 

variable="$(awk -F'[\[\]]' '{print $2}' <<< "$line")" 

或完整

while IFS='[]' read -r foo fruit rest; do echo $fruit; done < file 

或以与阵列:

while IFS='[]' read -ra var; do echo "${var[1]}"; done < file 
+0

感谢它的工作!我也只是了解到这也适用:'word = $ line word = $ {word ## * [} word = $ {word %%] *}' –

0

除了使用awk,您还可以使用bash提供的本地参数扩展/子字符串提取。低于#表示从左边开始修剪,而%用于从右侧修剪。 (注:单个#%表示去除直至第一发生,同时##%%表示去除所有出现):

#!/bin/bash 

[ -r "$1" ] || { ## validate input is readable 
    printf "error: insufficient input. usage: %s filename\n" "${0##*/}" 
    exit 1 
} 

## read each line and separate label and value 
while read -r line || [ -n "$line" ]; do 
    label=${line#[}  # trim initial [ from left 
    label=${label%%]*} # trim through ] from right 
    value=${line##*] } # trim from left through '[ ' 
    printf " %-8s -> '%s'\n" "$label" "$value" 
done <"$1" 

exit 0 

输入

$ cat dat/labels.txt 
[apple] This is a fruit. 
[ball] This is a sport's equipment. 
[cat] This is an animal. 

输出

$ bash readlabel.sh dat/labels.txt 
apple -> 'This is a fruit.' 
ball  -> 'This is a sport's equipment.' 
cat  -> 'This is an animal.' 
相关问题