在特定字段中剪切字符串

时间:2013-06-05 21:09:58

标签: regex bash sed awk cut

cat test.txt
/one/two/thre.erf;/four/five;4;4
/six/seven/eight.erf;/nine/ten/AABD_CASH_EDBC_FLOW;4;4

期望的输出:

four
nine/ten

这样做:将输出放在一行 - 问题。

cat test.txt| cut -d ';' -f2 | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}'
/four//nine/ten/

有更好的方法吗?

6 个答案:

答案 0 :(得分:3)

您可以一次性获得所需的输出:

awk -F';' '{d=$2;f=$2
        sub(/\/[^/]*$/,"",d)
        sub(/.*\//,"",f)
        a[NR]=d;b[NR]=f}

        END{for(;++i<=NR;)print a[i]
            print ""
            for(;++j<=NR;)print b[j]}' file

将输出:

/four
/nine/ten

five
AABD_CASH_EDBC_FLOW

修改

没有注意到OP已经改变了这个问题。这一变化使我的上述答案毫无意义,但它使问题变得更加容易。它可以完成

awk

kent$  awk -F';/' 'sub(/\/[^/]*$/,"",$2)&& $0=$2' file 
four
nine/ten

或仅与 grep

kent$  grep -Po '^.*?;/\K.*(?=/[^/]*$)' file
four
nine/ten

答案 1 :(得分:2)

的一个选项。

script.vim的内容:

set backup
g/^/normal df;x$dF/x
normal ZZ

像以下一样运行:

vim -S script.vim test.txt

该文件就地修改产生:

four
nine/ten

还会创建一个附加~后缀的备份文件,以避免在第一次尝试时超过游戏。

答案 2 :(得分:1)

GNU sed

sed 's:^.*;/\(\w*/\w*\).*:\1:;1~2s:/.*::' file

..输出是:

four
nine/ten

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r 's|[^;]*;/([^;/]*(/[^;/]*)*)/.*|\1|' file

这预先假定第二个字段中至少有/个。{/ p>

答案 4 :(得分:0)

 grep -Po '(?<=;)/[^;]*(?=/)' test.txt

答案 5 :(得分:0)

while IFS=';' read -ra fields; do 
    d=$(dirname "${fields[1]}")
    echo "${d#/}"
done < test.txt