假设我有这样的文字:
a b [c] d [e]
f [g]
[h]
i j
k [l]
我想问一下如何使用sed或awk命令逐行提取括号之间的字符串吗?
输出应为:
c e
g
h
l
答案 0 :(得分:2)
这可能对您有用(GNU sed):
sed -r 's/[^[]*(\[([^]]*)\])*( *)[^[]*/\2\3/g' file
答案 1 :(得分:1)
请您尝试以下。
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
解决方案2: ,带有简单的for
循环解决方案。
awk '
{
for(i=1;i<=NF;i++){
if($i~/^\[.*\]/){
gsub(/\]|\[/,"",$i)
printf("%s%s",$i,i==NF?"":OFS)
}
}
print ""
}
' Input_file
输出如下。
c e
g
h
l
答案 2 :(得分:0)
使用awk .tgz
并观察到每个偶数字段都需要打印:
npm install
输出:
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
答案 3 :(得分:0)
另一个GNU awk:
awk -v RS='[][]' -F'\n' 'NR>1{printf("%s",((NR+1)%2?$0:" "));for(i=1;i<NF;i++){printf "\n"}}' file
记录分隔符RS
设置为[
或]
。这样就可以用数字记录NR
和NR+1%2
捕获这些方括号之间的记录。
-F
和for
语句根据输入文件打印换行符。