【发布时间】:2016-11-09 14:03:26
【问题描述】:
我正在使用以下命令根据分隔符剪切字符串。但我希望输出与分隔符一起打印。
示例字符串: test_file.txt
命令:
echo "test_file.txt" | cut -sd_ -f1
当前输出:测试
预期输出:test_
编辑:如果字符串不包含分隔符,我正在使用 cut -sd 报告 null。所以如果分隔符不存在,我也应该将输出设为空。
【问题讨论】:
我正在使用以下命令根据分隔符剪切字符串。但我希望输出与分隔符一起打印。
示例字符串: test_file.txt
命令:
echo "test_file.txt" | cut -sd_ -f1
当前输出:测试
预期输出:test_
编辑:如果字符串不包含分隔符,我正在使用 cut -sd 报告 null。所以如果分隔符不存在,我也应该将输出设为空。
【问题讨论】:
如果您使用的是 BASH,则不需要外部工具:
s='test_file.txt'
[[ $s == *_* ]] && echo "${s%%_*}"_
test_
或者使用sed:
sed -n 's/_.*/_/p' <<< "$s"
test_
或者使用awk:
awk -F_ 'NF>1{print $1 FS}' <<< "$s"
test_
【讨论】:
cut 无法做到这一点,但sed 可以做到这一点:
$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/'
test_
如果你不想在没有_的情况下打印任何东西,最简单的方法可能是分别清除这些行,
$ echo "test_file.txt" | sed '/^[^_]*$/d; s/\([^_]*_\).*$/\1/'
【讨论】:
_的行保持不变;我添加了另一个按照您的要求运行的选项。
echo "test_file.txt" |grep -oP '^.*?_'
test_
这将打印从行首到 first 分隔符 (_) 的任何内容,包括分隔符。
【讨论】: