Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从“转换字符串”;abc"-&燃气轮机&引用^A.*B.*C";在狂欢节上_Bash_Shell - Fatal编程技术网

Bash 从“转换字符串”;abc"-&燃气轮机&引用^A.*B.*C";在狂欢节上

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内置

我正在调用一个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/\.\*$/'另一个pure
bash
使用正则表达式:

[[ "${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))另一个pure
bash
使用正则表达式:

[[ "${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
logs
3.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!