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/
有更好的方法吗?
答案 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)
vim的一个选项。
script.vim
的内容:
set backup
g/^/normal df;x$dF/x
normal ZZ
像以下一样运行:
vim -S script.vim test.txt
该文件就地修改产生:
four
nine/ten
还会创建一个附加~
后缀的备份文件,以避免在第一次尝试时超过游戏。
答案 2 :(得分:1)
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