我是Unix脚本的新手,我正在尝试编写一个脚本,该脚本应该能够追加换行符并将变量中的值打印到新行中,而不是相同的行。
由于数据是动态的,并且它可能包含更多的字符串而不仅仅是一个,我必须在其中添加一个循环和一些条件以将值保存在新行中的变量中。
以新行格式存储在变量中的字符串:
"CA 1938" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1937" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1934" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
我的想法是编写一些正则表达式比较并使用它来运行在这个变量中插入新行.Below是我想要实现该操作的代码。
var="CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
for i in $var; do
#echo $i
p="$p"$'\n'"$i"
done
echo "$p"
预期输出
CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
实际输出
CA
1938
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA
1937
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA
1934
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
因此上面的实际输出即将到来,因为$i
是由空格分隔的所有字符串值。你能不能帮助我得到我想要的东西。实际上这 CA(任务编号)和 XX(任务描述)。
答案 0 :(得分:2)
这应该有效:
var='CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
var="${var// CA/$'\n'CA}"
echo "$var"
输出:
CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
答案 1 :(得分:0)
使用grep -o
即可:
var='CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
grep -oE 'CA\s+\S+\s+\S+' <<< "$var"
CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
答案 2 :(得分:0)
您没有正确解析输入,for
会中断var
进入以空格分隔的部分(基于IFS
)所以你实际上是
为每个&#34; word添加一个新行&#34;在var
中,而不是每个令牌。
正如您所建议的那样,我会使用sed -r
的正则表达式来正确解析它,并将其保存到变量中:
p=$(echo $var | sed -r 's/(CA \S+ \S+ )/\1\n/g')
\S
匹配任何非空格字符,+
匹配&#34;一个或多个字符&#34;,因此正则表达式将输入分解为每个&#34; CA& #34;接下来是两个字。