![如何在 Bash 脚本中修剪用户输入?](https://linux22.com/image/883290/%E5%A6%82%E4%BD%95%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BF%AE%E5%89%AA%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%EF%BC%9F.png)
好的,这是给定的用户输入:
$ 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
。
是特定的,被称为此处字符串,因此这在 中不起作用。它类似于重定向到文件<<<
,只是它将字符串重定向到流而不是文件。bash
sh
最后,为了使字符串完整,我将其添加.txt
回来,然后重mv
命名该文件。