Bash从字符串中剪切第一个和/或最后一个字符,但前提是它是某个特定字符

时间:2014-12-03 21:53:02

标签: regex bash sed

在bash中我需要从字符串中删除第一个和/或最后一个字符,但前提是它只是某个字符。

如果我有|我需要

/foo/bar/hah/   =>   foo/bar/hah

foo/bar/hah     =>   foo/bar/hah

你可以贬低我没有列出我尝试过的所有内容。但事实是我已经尝试了至少35个不同的sed字符串和bash字符的东西,其中许多是来自堆栈溢出。我根本无法做到这一点。

7 个答案:

答案 0 :(得分:4)

纯粹

$ var=/foo/bar/hah/
$ var=${var%/}
$ echo ${var#/}
foo/bar/hah
$ 

检查bash parameter expansion

$ sed -r 's@(^/|/$)@@g' file

答案 1 :(得分:4)

简单的问题是什么?

sed "s/^\///;s/\/$//"

输出

foo/bar/hah
foo/bar/hah

答案 2 :(得分:1)

这个怎么样:

echo "$x" | sed -e 's:^/::' -e 's:/$::'

答案 3 :(得分:1)

继@ sputnick的回答和this answer之后,这是一个可以做到的功能:

STR="/foo/bar/etc/";
STRB="foo/bar/etc";

function trimslashes {
    STR="$1"
    STR=${STR#"/"}
    STR=${STR%"/"}
    echo "$STR"
}

trimslashes $STR
trimslashes $STRB

# foo/bar/etc
# foo/bar/etc

答案 4 :(得分:1)

 echo '/foo/bar/hah/' | sed 's#^/##' | sed 's#/$##'

答案 5 :(得分:1)

假设/字符是您尝试删除的唯一字符,那么sed -E 's_^[/](.*)_\1_'应该完成这项工作:

$ echo "$var1"; echo "$var2"
/foo/bar/hah
foo/bar/hah


$ echo "$var1" | sed -E 's_^[/](.*)_\1_'
foo/bar/hah


$ echo "$var2" | sed -E 's_^[/](.*)_\1_'
foo/bar/hah

如果您还需要在行的开头替换其他字符,请将其添加到[/]类。例如,如果您需要替换/-,则会sed -E 's_^[/-](.*)_\1_'

答案 6 :(得分:1)

以下是awk版本:

echo "/foo/bar/hah/" | awk '{gsub(/^\/|\/$/,"")}1'
foo/bar/hah