我是bash脚本的新手,我的目录结构如下所示。
" / ABC / DEF / GHI / JKL / 2015/01/01#34;
我正在尝试生成这样的输出 - " JKL_2015-01-01"。
我正在尝试使用sed和cut并且可能需要一段时间,但这需要立即,任何帮助表示赞赏。谢谢。
答案 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}"