提取部分文件路径并在bash中连接

时间:2015-02-25 20:48:38

标签: bash

我是bash脚本的新手,我的目录结构如下所示。

" / ABC / DEF / GHI / JKL / 2015/01/01#34;

我正在尝试生成这样的输出 - " JKL_2015-01-01"。

我正在尝试使用sed和cut并且可能需要一段时间,但这需要立即,任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:0)

i=/ABC/DEF/GHI/JKL/2015/01/01
o=`echo $i | sed -r 's|^.+/([^/]+)/([0-9]+)/([0-9]+)/([0-9]+)$|\1_\2-\3-\4|'`

i=xxx是一个变量赋值,=周围没有空格!

`command`
反引号附带的

是一个命令替换,它以字符串形式捕获命令内部的标准输出。

sed是流编辑器,主要将基于正则表达式的操作应用于标准输入的每一行,并在标准输出上发出结果。

sed的s|||操作是基于正则表达式的替换。我使用parens ()捕获4个字符组:(非斜杠),斜杠,(数字),斜杠,(数字),斜杠,(数字),字符串结尾$。然后在subst的第二部分中,我打印了捕获的组,分别用下划线和2个破折号分开。

答案 1 :(得分:0)

没有必要使用内置于bash中的工具 - 使用内置函数比sed等外部工具效率更高。

s="/ABC/DEF/GHI/JKL/2015/01/01"
s_re='/([^/]+)/([^/]+)/([^/]+)/([^/]+)$'
if [[ $s =~ $s_re ]]; then
  name="${BASH_REMATCH[1]}_${BASH_REMATCH[2]}-${BASH_REMATCH[3]}-${BASH_REMATCH[4]}"
  echo "$name"
fi

或者,也许更可读(使用BashFAQ #100中记录的字符串操作技术):

s="/ABC/DEF/GHI/JKL/2015/01/01"
s_prefix=${s%/*/*/*/*}          # find the content we don't care about
s_suffix=${s#"$s_prefix"/}      # strip that content

# read the rest into named variables
IFS=/ read -r category year month day <<<"$s_suffix"

# assemble those named variables into the string we care about
echo "${category}_${year}-${month}-${day}"