shell 制作一个将句子转换为标题大小写的脚本?

az31mfrm  于 2023-06-24  发布在  Shell
关注(0)|答案(4)|浏览(90)

我有一个命令,我用它来转换句子的标题大小写。这是低效的,必须复制这个命令的文本文件,然后粘贴到终端之前,然后也粘贴在句子我想转换。命令是:

echo "my text" | sed 's/.*/\L&/; s/[a-z]*/\u&/g'

我如何将其转换为脚本,以便我可以从终端调用以下内容:

TitleCaseConverter "my text"

有没有可能创建这样的脚本?是否可以从任何文件夹位置使其工作?

x6yk4ghg

x6yk4ghg1#

由于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
7ajki6be

7ajki6be2#

将它 Package 到.bashrc.bash_profile中的函数中,然后从当前shell中将它 Package 到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进行单词拆分。

epggiuax

epggiuax3#

我没有评论私人,但轻微的改进ManUnitedBloke的答案,这将处理收缩,如“不要”和“谁的”。
echo "my text" | sed 's/.*/\L&/; s/[a-z']*/\u&/g'

5rgfhyps

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年,肯德基与麦当劳

相关问题