Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Shell 在Unix中格式化字符串_Shell_Unix_Awk_Sed - Fatal编程技术网

Shell 在Unix中格式化字符串

Shell 在Unix中格式化字符串,shell,unix,awk,sed,Shell,Unix,Awk,Sed,预期o/p: $ landscape=aws,azure $ echo $landscape 我现在是怎么做的 aws-landscape,azure-landscape 有更好的方法吗?替换逗号不是一种特别好的样式 您可以这样做: $ landscape=aws,azure $ GITLANDSCAPE=$(echo $Landscapes | sed 's/,/-landscape,/g' | sed 's/$/-landscape/g') $ echo $GITLANDSCAPE 输

预期o/p:

$ landscape=aws,azure
$ echo $landscape
我现在是怎么做的

aws-landscape,azure-landscape

有更好的方法吗?

替换逗号不是一种特别好的样式

您可以这样做:

$ landscape=aws,azure
$ GITLANDSCAPE=$(echo $Landscapes | sed 's/,/-landscape,/g' | sed 's/$/-landscape/g')
$ echo $GITLANDSCAPE
输出:

landscape=aws,azure
echo $landscape | awk 'BEGIN{FS=",";OFS=",";suffix="-landscape"}{print $1suffix,$2suffix}'
在“开始”块中,设置以下变量:

FS:字段分隔符 输出字段分隔符 后缀:您可以在此处使用变量,以防以后要更改文本,而不想更改代码中多个位置的文本
替换逗号不是一种特别好的样式

您可以这样做:

$ landscape=aws,azure
$ GITLANDSCAPE=$(echo $Landscapes | sed 's/,/-landscape,/g' | sed 's/$/-landscape/g')
$ echo $GITLANDSCAPE
输出:

landscape=aws,azure
echo $landscape | awk 'BEGIN{FS=",";OFS=",";suffix="-landscape"}{print $1suffix,$2suffix}'
在“开始”块中,设置以下变量:

FS:字段分隔符 输出字段分隔符 后缀:您可以在此处使用变量,以防以后要更改文本,而不想更改代码中多个位置的文本
使用sed,您可以执行以下操作:

aws-landscape,azure-landscape
或者,您可以使用awk:

echo $landscape | sed -E 's/,|$/-landscape&/g'
aws-landscape,azure-landscape

使用sed,您可以执行以下操作:

aws-landscape,azure-landscape
或者,您可以使用awk:

echo $landscape | sed -E 's/,|$/-landscape&/g'
aws-landscape,azure-landscape

如果我没弄错的话,你有一个变量,它包含一个逗号分隔的单词列表。您希望为这些单词中的每一个添加一个固定字符串,-scape,并保留逗号作为分隔符

这是一种方法,前提是所有单词都不包含空格:

echo $landscape | awk -F, '{print $1"-landscape,"$2"-landscape"}'
aws-landscape,azure-landscape
这会打印出来

words1=ab,cd,ef,gh
words2=$(printf %s $words1 | xargs --delimiter , -L 1 printf "%s-landscape " | fmt -1 | paste -d, -s)
echo $words2

工作原理:xargs将单词1字符串拆分为单个单词,并调用printf为每个单词添加-scape。结果输出仍然由空格分隔,而不是逗号分隔。使用fmt,这些单词被放在单独的行中,每个单词一行。最后的粘贴用逗号连接这些行。

如果我没听错,您有一个变量,其中包含一个逗号分隔的单词列表。您希望为这些单词中的每一个添加一个固定字符串,-scape,并保留逗号作为分隔符

这是一种方法,前提是所有单词都不包含空格:

echo $landscape | awk -F, '{print $1"-landscape,"$2"-landscape"}'
aws-landscape,azure-landscape
这会打印出来

words1=ab,cd,ef,gh
words2=$(printf %s $words1 | xargs --delimiter , -L 1 printf "%s-landscape " | fmt -1 | paste -d, -s)
echo $words2

工作原理:xargs将单词1字符串拆分为单个单词,并调用printf为每个单词添加-scape。结果输出仍然由空格分隔,而不是逗号分隔。使用fmt,这些单词被放在单独的行中,每个单词一行。最后的粘贴使用逗号连接这些行。

使用逗号分隔字符串可能是这里的主要难点。shell自然支持空格分隔的令牌

ab-landscape,cd-landscape,ef-landscape,gh-landscape
如果你想做一些更复杂的事情,也许是一个循环

printf '%s-landscape\n' aws azure
如果你想做更复杂的事情,也许可以把它们放在一个数组中。这不是Bourne/posixsh兼容的,而是Ksh、Bash等中的常见扩展

sep=''
for token in aws azure; do
    printf '%s%s-landscape' "$sep" "$token"
    sep=','
done
另一方面,在Bash中,还有大括号扩展:

a=(aws azure)
for token in "${a[@]}"; do ...
这是一种折磨,但却产生了你所要求的:

printf '%s\n' {aws,azure}-landscape

第一个逗号分隔大括号之间的短语。要在其中一个短语中包含文字逗号,我们将其反斜杠。

使用逗号分隔字符串可能是这里的主要难点。shell自然支持空格分隔的令牌

ab-landscape,cd-landscape,ef-landscape,gh-landscape
如果你想做一些更复杂的事情,也许是一个循环

printf '%s-landscape\n' aws azure
如果你想做更复杂的事情,也许可以把它们放在一个数组中。这不是Bourne/posixsh兼容的,而是Ksh、Bash等中的常见扩展

sep=''
for token in aws azure; do
    printf '%s%s-landscape' "$sep" "$token"
    sep=','
done
另一方面,在Bash中,还有大括号扩展:

a=(aws azure)
for token in "${a[@]}"; do ...
这是一种折磨,但却产生了你所要求的:

printf '%s\n' {aws,azure}-landscape


第一个逗号分隔大括号之间的短语。要在其中一个短语中包含文字逗号,我们将其反斜杠。

请在此处添加您的目标是什么?应预期的输出。请在您的帖子中发布所有细节,然后让我们知道。您的实际问题是什么?你的代码不工作了吗?你能给我们你的输入和相应的预期输出吗?我得到了想要的o/p。。!我只是想知道做这件事的最佳方式。我投票决定把这个问题作为离题题来结束,因为它属于“请做”添加你的目标是什么?应预期的输出。请在您的帖子中发布所有细节,然后让我们知道。您的实际问题是什么?你的代码不工作了吗?你能给我们你的输入和相应的预期输出吗?我得到了想要的o/p。。!我只是想知道最好的方法。我投票将这个问题作为离题题来结束,因为它属于@Guy,\0表示完全匹配的字符串。我尝试了一下,发现是的。这是很难搜索更多的信息tho!所以不同于只针对特定捕获的组。。干杯。不过,我不认为这对sed来说是全面的。这是GNU-sed扩展吗?@tripleee,你是说选项-E吗?不,我是说\0序列,尽管它可能是sed的任何版本上的非标准-E扩展的一个特性。@Guy,\0表示完全匹配的字符串。我试过了,发现是的。这是很难搜索更多的信息tho!所以不同于只针对特定捕获的组。。干杯。不过,我不认为这对sed来说是全面的。这是GNU-sed扩展吗?@triplee
e、 你是说-e选项吗?不,我是说\0序列,尽管它可能是sed的任何版本上的非标准-e扩展的一个功能。真是一个不错的功能。。!谢谢:真是一个不错的。。!谢谢: