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

RNA*_*RNA 3 bash scripts

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

$ myscript.sh file-name.txt
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
FILENAME=$1

# trim text after '-' from user input 'file-name.txt'
# save 'file' back to $1
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是以某种方式混合 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"
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 8

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

FILENAME="${1%-*}"
Run Code Online (Sandbox Code Playgroud)

%用于去除最短的匹配后缀。如果你有file-name-foo,你会得到file-name。要删除最长的匹配后缀,请使用%%.

要保存到$1,您必须使用set. 就像是:

set -- "${1%-*}" "${@:2}"
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Putnik BashFAQ 是一个很好的资源:http://mywiki.wooledge.org/BashFAQ/005#Retrieving_values_from_an_array 和 http://mywiki.wooledge.org/BashFAQ/100 (2认同)

Pil*_*ot6 5

你可以通过

#!/bin/bash
FILENAME=$1
TRIMMED=$(echo "$FILENAME" | cut -f1 -d-)
Run Code Online (Sandbox Code Playgroud)

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