如何在 Bash 脚本中修剪用户输入?

如何在 Bash 脚本中修剪用户输入?

好的,这是给定的用户输入:

$ myscript.sh file-name.txt

我想修剪“file-name.txt”以在 bash 脚本中检索“文件”

#!/bin/bash
FILENAME=$1

# trim text after '-' from user input 'file-name.txt'
# save 'file' back to $1

我最好的猜测是以某种方式混合 sed 和正则表达式,但我并不是这方面的专家:(

有任何想法吗?


我尝试了 muru 的建议,以实现更复杂的输入。

给定输入:ABCD-0.1.5-6.1.txt

所需输出:ABCD

#!/bin/bash
TRIMMED1="${1%-*}"
TRIMMED2="${1%%-*}"
TRIMMED3="${TRIMMED1%-*}"
TRIMMED4="${TRIMMED1%%-*}"
TRIMMED5="${1%-[0-9]*}"
TRIMMED6="${1%%-[0-9]*}"
echo "user input : $1"
echo "TRIMMED1 : $TRIMMED1"
echo "TRIMMED2 : $TRIMMED2"
echo "TRIMMED3 : $TRIMMED3"
echo "TRIMMED4 : $TRIMMED4"
echo "TRIMMED5 : $TRIMMED5"
echo "TRIMMED6 : $TRIMMED6"

结果:

user input : A-B-C-D-0.1.5-6.1.txt
TRIMMED1 : A-B-C-D-0.1.5
TRIMMED2 : A
TRIMMED3 : A-B-C-D
TRIMMED4 : A
TRIMMED5 : A-B-C-D-0.1.5
TRIMMED6 : A-B-C-D

答案1

您不必为此使用外部工具。纯 bash:

FILENAME="${1%-*}"

%用于删除最短匹配后缀。如果您有file-name-foo,您将得到file-name。要删除最长匹配后缀,请使用%%

要保存到$1,您必须使用set。例如:

set -- "${1%-*}" "${@:2}"

然后,您下次使用时$1,它将具有修剪后的文本。

请记住,=分配变量时周围不要有空格。

答案2

你可以通过以下方式

#!/bin/bash
FILENAME=$1
TRIMMED=$(echo "$FILENAME" | cut -f1 -d-)

该命令将使用字段 1-作为分隔符来输出。

答案3

可以这样做:

#!/bin/bash
# trim text after '-' from user input 'file-name.txt'
FILENAME="$(sed 's/-.*//' <<< $1).txt"

# save 'file' back to $1
mv "$1" "$FILENAME"

解释:

在我的示例中,我使用sed命令来缩短名称,通常具有以下布局'command/search/replacement/'。在上面的示例中,我使用s搜索和替换命令,然后-.*使用搜索词(正则表达式),它将搜索以 开头-然后是随机字符的所有组合.,并告诉它一直到以 结尾*。替换字符串我留空,这意味着file-name.txt变成file

是特定的,被称为此处字符串,因此这在 中不起作用。它类似于重定向到文件<<<,只是它将字符串重定向到流而不是文件。bashsh

最后,为了使字符串完整,我将其添加.txt回来,然后重mv命名该文件。

相关内容