Bash 提取每行括号之间的字符串
假设我有这样一个文本:Bash 提取每行括号之间的字符串,bash,awk,sed,Bash,Awk,Sed,假设我有这样一个文本: a b [c] d [e] f [g] [h] i j k [l] 我想问一下如何使用sed或awk命令逐行提取括号之间的字符串 输出应为: c e g h l 你能试试下面的吗 awk ' { while(match($0,/\[[^\]]*/)){ val=(val?val OFS substr($0,RSTART,RLENGTH):substr($0,RSTART,RLENGTH)) $0=substr($0,RSTART+RLENGTH)
a b [c] d [e]
f [g]
[h]
i j
k [l]
我想问一下如何使用sed或awk命令逐行提取括号之间的字符串
输出应为:
c e
g
h
l
你能试试下面的吗
awk '
{
while(match($0,/\[[^\]]*/)){
val=(val?val OFS substr($0,RSTART,RLENGTH):substr($0,RSTART,RLENGTH))
$0=substr($0,RSTART+RLENGTH)
}
}
{
gsub(/\[|\]/,"",val)
print val
val=""
}
' Input_file
第二种解决方案:使用简单的循环解决方案
awk '
{
for(i=1;i<=NF;i++){
if($i~/^\[.*\]/){
gsub(/\]|\[/,"",$i)
printf("%s%s",$i,i==NF?"":OFS)
}
}
print ""
}
' Input_file
使用awk,FS=“[]”
并观察到每个偶数字段都需要打印:
$ awk '
BEGIN { FS="[][]" }
{
for(i=2;i<=NF;i+=2) # get every other field separated by [ and ]
b=b $i OFS # buffer them up, there will be a trailing OFS
print b; b="" # output
}' file
解决方案要求不存在未配对或嵌套的[]
s这可能适用于您(GNU-sed):
另一个GNU awk:
awk -v RS='[][]' -F'\n' 'NR>1{printf("%s",((NR+1)%2?$0:" "));for(i=1;i<NF;i++){printf "\n"}}' file
awk-v RS='[]]'-F'\n''NR>1{printf(“%s”)((NR+1)%2?$0:);对于(i=1;iIt总是建议您也在您的帖子中添加您的努力,以解决您的问题。请这样做。
c e
g
h
l
sed -r 's/[^[]*(\[([^]]*)\])*( *)[^[]*/\2\3/g' file
awk -v RS='[][]' -F'\n' 'NR>1{printf("%s",((NR+1)%2?$0:" "));for(i=1;i<NF;i++){printf "\n"}}' file