Bash 从“转换字符串”;abc"-&燃气轮机&引用^A.*B.*C";在狂欢节上
我正在调用一个bash脚本,如Bash 从“转换字符串”;abc"-&燃气轮机&引用^A.*B.*C";在狂欢节上,bash,shell,Bash,Shell,我正在调用一个bash脚本,如/test.sh abc,参数“abc”用于格式为^char\u 1.*char\u 2.*的grep参数。。。char_N,其中“char_i”是第i个输入字符的大写版本。我正在grep'ing的当前文本文件是一长串完全大写的单词,每行换行一个 在阅读有关字符串操作的文章时,我遇到了大量来自sed、awk、tr等程序的非常令人困惑的例子。如果我的目标只是将输入字符大写,并将其置于该形式,那么哪个Bash命令最有用,我如何使用该命令实现此操作?一个仅使用Bash内置
/test.sh abc
,参数“abc”
用于格式为^char\u 1.*char\u 2.*的grep参数。。。char_N
,其中“char_i”是第i个输入字符的大写版本。我正在grep'ing的当前文本文件是一长串完全大写的单词,每行换行一个
在阅读有关字符串操作的文章时,我遇到了大量来自sed、awk、tr等程序的非常令人困惑的例子。如果我的目标只是将输入字符大写,并将其置于该形式,那么哪个Bash命令最有用,我如何使用该命令实现此操作?一个仅使用Bash内置字符串操作支持的简单实现:
#!/usr/bin/env bash
# ^^^^- NOT /bin/sh; the C-style for loop is an extension.
in=${1^^}
out='^'
for ((i=0; i<${#in}; i++)); do
out+="${in:$i:1}.*"
done
out=${out%".*"} # trim last .*
echo "$out"
#/usr/bin/env bash
#^^^^-非/bin/sh;C风格的for循环是一个扩展。
in=${1^^}
out=“^”
对于((i=0;i一个仅使用的简单实现bash的内置字符串操作支持:
#!/usr/bin/env bash
# ^^^^- NOT /bin/sh; the C-style for loop is an extension.
in=${1^^}
out='^'
for ((i=0; i<${#in}; i++)); do
out+="${in:$i:1}.*"
done
out=${out%".*"} # trim last .*
echo "$out"
!/usr/bin/env bash
#^^^^-NOT/bin/sh;循环的C样式是一个扩展。
in=${1^^}
out=“^”
对于((i=0;i有点冗长,但awk也可以做这项工作:
s='abc'
awk '{s=toupper($0); c1=substr(s,1,1); s=substr(s,2); gsub(/./, ".*&", s); print "^" c1 s}' <<< "$s"
^A.*B.*C
s='abc'
awk'{s=toupper($0);c1=substr(s,1,1);s=substr(s,2);gsub(/。/,“*&”,s);打印“^”c1s}”有点详细,但awk也可以完成以下工作:
s='abc'
awk '{s=toupper($0); c1=substr(s,1,1); s=substr(s,2); gsub(/./, ".*&", s); print "^" c1 s}' <<< "$s"
^A.*B.*C
s='abc'
awk'{s=toupper($0);c1=substr(s,1,1);s=substr(s,2);gsub(/。/,“*&”,s);打印“^”c1s}”为完整起见,这里有一个sed
解决方案:
sed 's/./\U&.*/g; s/^/^/; s/\.\*$//' <<<abc
^A.*B.*C
sed's//\U&.*/g;s/^/^;s/\.\*$/'为了完整起见,这里有一个sed
解决方案:
sed 's/./\U&.*/g; s/^/^/; s/\.\*$//' <<<abc
^A.*B.*C
sed's//\U&.*/g;s/^/^;s/\.\*$/'另一个purebash
使用正则表达式:
[[ "${1^^}" =~ ${1//?/(.)} ]] # to upprcase + make regex + match
b=${BASH_REMATCH[@]:1} # join by spaces
printf -v out "^%s" "${b// /.*}" # print to var, prepend ^, replace spaces with .*
echo "$out"
#^A.*B.*C
还有pfe(perl for everything):)
perl-F/-nlE'say uc(“^”.join(“.*”,@F))另一个purebash
使用正则表达式:
[[ "${1^^}" =~ ${1//?/(.)} ]] # to upprcase + make regex + match
b=${BASH_REMATCH[@]:1} # join by spaces
printf -v out "^%s" "${b// /.*}" # print to var, prepend ^, replace spaces with .*
echo "$out"
#^A.*B.*C
还有pfe(perl for everything):)
perl-F/-nlE'说uc(“^”.join(“.*”,@F))“呃,^A.*B.*C
或^A.*B.*C
?我认为这种区别实际上不是有意的,因为它没有反映在解释性文本中,而只是反映在标题中,但明确的澄清不会有什么坏处。对不起,这是含糊不清的。我编辑它是为了清晰。呃,^A.*B.*C
或^A.*B.*C
?我认为是这样的这种差异实际上并不是有意的,因为它并没有反映在解释性文本中,而只是反映在标题中,但明确的澄清不会有什么坏处。对不起,这是模棱两可的。为了清晰起见,我编辑了它。谢谢,这非常有帮助。echo$BASH_VERSION
logs3.2.57(1)-释放
所以我使用了tr
命令进行大写。或者,在bash
v4上,declare-u out
将分配给它的任何字符转换为大写。谢谢,这非常有用。echo$bash\u版本
日志3.2.57(1)-释放
,所以我使用了tr
命令进行大写。或者,在bash
v4上,declare-u out
会将分配给它的任何字符转换为大写。@alvits-yikes!。首先我玩一个函数和IFS
,当我放弃这个想法时,$()
仍然保留。你是对的。:)-edited&thanx!@alvits-yikes!。首先我玩一个函数和IFS
,当我放弃这个想法时,$()
仍然存在。你说得对。:-edited&thanx!