Shell Unix:剪切带分隔符的字符串

Shell Unix:剪切带分隔符的字符串,shell,unix,Shell,Unix,我正在使用下面的命令根据分隔符剪切字符串。但我希望输出与分隔符一起打印 示例字符串:test\u file.txt 命令: echo "test_file.txt" | cut -sd_ -f1 电流输出:测试 预期输出:测试_ 编辑:如果字符串不包含分隔符,我将使用cut-sd报告null。因此,如果分隔符不存在,我也应该将输出设置为null 您不能使用cut,但可以使用sed: $ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/' test_

我正在使用下面的命令根据分隔符剪切字符串。但我希望输出与分隔符一起打印

示例字符串:test\u file.txt

命令:

echo "test_file.txt" | cut -sd_ -f1
电流输出:测试

预期输出:测试_


编辑:如果字符串不包含分隔符,我将使用cut-sd报告null。因此,如果分隔符不存在,我也应该将输出设置为null

您不能使用
cut
,但可以使用
sed

$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/'
test_
sed -n 's/_.*/_/p' <<< "$s"

test_
如果您不希望在没有
\uuuu
的情况下打印任何内容,最简单的方法可能是分别删除这些行

$ echo "test_file.txt" | sed '/^[^_]*$/d; s/\([^_]*_\).*$/\1/'

您不能使用
cut
,但可以使用
sed

$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/'
test_
sed -n 's/_.*/_/p' <<< "$s"

test_
如果您不希望在没有
\uuuu
的情况下打印任何内容,最简单的方法可能是分别删除这些行

$ echo "test_file.txt" | sed '/^[^_]*$/d; s/\([^_]*_\).*$/\1/'

如果您使用的是BASH,则不需要外部工具:

s='test_file.txt'
[[ $s == *_* ]] && echo "${s%%_*}"_

test_
或使用
sed

$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/'
test_
sed -n 's/_.*/_/p' <<< "$s"

test_

如果您使用的是BASH,则不需要外部工具:

s='test_file.txt'
[[ $s == *_* ]] && echo "${s%%_*}"_

test_
或使用
sed

$ echo "test_file.txt" | sed 's/\([^_]*_\).*$/\1/'
test_
sed -n 's/_.*/_/p' <<< "$s"

test_
这将打印从行首到第一个分隔符(
\uu
)的任何内容,包括分隔符


这将打印从行首到第一个分隔符(
\uu
)的任何内容,包括分隔符

谢谢你的快速解决方案。。我在cut命令中使用sd,所以如果没有分隔符,它将报告null。这也可以通过sed实现吗?例如,如果我使用testfile.txt,我应该得到空输出,因为分隔符不存在。我的原始命令将保留不包含任何
\uuu
的行;我已经添加了另一个选项,可以按照您的要求运行。感谢您提供快速解决方案。。我在cut命令中使用sd,所以如果没有分隔符,它将报告null。这也可以通过sed实现吗?例如,如果我使用testfile.txt,我应该得到空输出,因为分隔符不存在。我的原始命令将保留不包含任何
\uuu
的行;我已经添加了另一个选项,可以按照您的要求运行。感谢您提供快速解决方案。。我在cut命令中使用sd,所以如果没有分隔符,它将报告null。这是否也可以通过上述命令完成?例如,如果我使用testfile.txt,我应该得到空的输出,因为分隔符不是presenties,我编辑的答案中的所有选项都会考虑到这一点。非常感谢:)干杯谢谢你的快速解决方案。。我在cut命令中使用sd,所以如果没有分隔符,它将报告null。这是否也可以通过上述命令完成?例如,如果我使用testfile.txt,我应该得到空的输出,因为分隔符不是presenties,我编辑的答案中的所有选项都会考虑到这一点。非常感谢:)干杯