我有一个命令,我用它来转换句子的标题大小写。这是低效的,必须复制这个命令的文本文件,然后粘贴到终端之前,然后也粘贴在句子我想转换。命令是:
echo "my text" | sed 's/.*/\L&/; s/[a-z]*/\u&/g'
我如何将其转换为脚本,以便我可以从终端调用以下内容:
TitleCaseConverter "my text"
有没有可能创建这样的脚本?是否可以从任何文件夹位置使其工作?
x6yk4ghg1#
由于bash的 * 参数扩展 * 包括大小写修改,因此不需要sed。一个简短的函数:
bash
sed
tc() { set ${*,,} ; echo ${*^} ; }
测试(不要使用引号,因为标题通常不会超过一个句子,这应该不重要):
tc FOO bar
输出:
Foo Bar
花哨的版本,避免了一些连词、冠词等大写:
ftc() { set ${*,,} ; set ${*^} ; echo -n "$1 " ; shift 1 ; \ for f in ${*} ; do \ case $f in A|The|Is|Of|And|Or|But|About|To|In|By) \ echo -n "${f,,} " ;; \ *) echo -n "$f " ;; \ esac ; \ done ; echo ; }
测试:
ftc the last of the mohicans
The Last of the Mohicans
7ajki6be2#
将它 Package 到.bashrc或.bash_profile中的函数中,然后从当前shell中将它 Package 到source中,怎么样
.bashrc
.bash_profile
source
TitleCaseConverter() { sed 's/.*/\L&/; s/[a-z]*/\u&/g' <<<"$1" }
或者)如果你想让它完美地避免任何类型的输入参数尾随的新行
printf "%s" "$1" | sed 's/.*/\L&/; s/[a-z]*/\u&/g'
现在,您可以从命令行source文件一次,以使函数可用,请执行
source ~/.bash_profile
现在您可以在命令行中直接使用它作为
str="my text" newstr="$(TitleCaseConverter "$str")" printf "%s\n" "$newstr" My Text
关于你的问题,我怎样才能把它转换成一个脚本,这样我就可以从终端调用下面这样的东西将函数添加到一个启动文件中可以解决这个问题,但建议将其添加到.bash_profile中。
TitleCaseConverter "this is stackoverflow" This Is Stackoverflow
OP试图用函数调用返回的名称创建一个目录,如下所示
mkdir "$(TitleCaseConverter "this is stackoverflow")"
这里的关键还是要对命令替换加上双引号,以避免shell进行单词拆分。
epggiuax3#
我没有评论私人,但轻微的改进ManUnitedBloke的答案,这将处理收缩,如“不要”和“谁的”。echo "my text" | sed 's/.*/\L&/; s/[a-z']*/\u&/g'
echo "my text" | sed 's/.*/\L&/; s/[a-z']*/\u&/g'
5rgfhyps4#
我意识到这是旧的,但是(需要类似的)发现这篇文章和agc的React是伟大的,然后我想要一个更复杂的东西,允许例外,即使是第一个“字”。对于我找到的许多代码示例,第一个单词总是转换为Camel-case。所以我做了一些调整就得到了这个。有一些荒谬的例外,如eBay,烧烤,肯德基,麦当劳等,但这更多的是看我能走多远,并(显然)不需要。此函数还可删除前导和尾随空格。这是用纯bash(4.3.)创建的,不需要其他程序。我已经把我的结果发布在这里,以防其他人可能正在寻找类似的东西。
ftc() { ((CHR_PTR=0)) set ${*,,} for f in ${*} ; do case $f in ebay) c+="eBay " ;; mcdonalds|"mcdonald's") c+="McDonald's " ;; vs) c+="vs. " ;; a|about|and|but|by|for|in|is|of|or|the|to) \ [ "$CHR_PTR" -eq "0" ] && { c+="${f^} " } || { c+="$f " } ;; bbq|diy|hdtv|hf|kfc|mdf|sdtv|shf|tv|uhf|vlf|vhf) c+="${f^^} " ;; *) c+="${f^} " ;; esac ((CHR_PTR++)) done x=${c## } ; c=${x%% } echo "$c" }
调用函数为:
LINEINPUT=" a diy tv and ebay didn't work for me (11 reasons why), but it's 2023 and Kfc vs mcdonald's " FOO=$(ftc "${LINEINPUT}") echo "$FOO"
结果:DIY电视和eBay对我不起作用(11个原因),但现在是2023年,肯德基与麦当劳
4条答案
按热度按时间x6yk4ghg1#
由于
bash
的 * 参数扩展 * 包括大小写修改,因此不需要sed
。一个简短的函数:测试(不要使用引号,因为标题通常不会超过一个句子,这应该不重要):
输出:
花哨的版本,避免了一些连词、冠词等大写:
测试:
输出:
7ajki6be2#
将它 Package 到
.bashrc
或.bash_profile
中的函数中,然后从当前shell中将它 Package 到source
中,怎么样或者)如果你想让它完美地避免任何类型的输入参数尾随的新行
现在,您可以从命令行
source
文件一次,以使函数可用,请执行现在您可以在命令行中直接使用它作为
关于你的问题,
我怎样才能把它转换成一个脚本,这样我就可以从终端调用下面这样的东西
将函数添加到一个启动文件中可以解决这个问题,但建议将其添加到
.bash_profile
中。更新:
OP试图用函数调用返回的名称创建一个目录,如下所示
这里的关键还是要对命令替换加上双引号,以避免shell进行单词拆分。
epggiuax3#
我没有评论私人,但轻微的改进ManUnitedBloke的答案,这将处理收缩,如“不要”和“谁的”。
echo "my text" | sed 's/.*/\L&/; s/[a-z']*/\u&/g'
5rgfhyps4#
我意识到这是旧的,但是(需要类似的)发现这篇文章和agc的React是伟大的,然后我想要一个更复杂的东西,允许例外,即使是第一个“字”。对于我找到的许多代码示例,第一个单词总是转换为Camel-case。所以我做了一些调整就得到了这个。有一些荒谬的例外,如eBay,烧烤,肯德基,麦当劳等,但这更多的是看我能走多远,并(显然)不需要。此函数还可删除前导和尾随空格。这是用纯bash(4.3.)创建的,不需要其他程序。
我已经把我的结果发布在这里,以防其他人可能正在寻找类似的东西。
调用函数为:
结果:DIY电视和eBay对我不起作用(11个原因),但现在是2023年,肯德基与麦当劳