Bash 在unix变量中的某些正则表达式之后插入新行

Bash 在unix变量中的某些正则表达式之后插入新行,bash,shell,unix,Bash,Shell,Unix,我是Unix脚本新手,我正在尝试编写一个脚本,它应该能够附加新行字符,并将变量中的值打印到新行中,而不是同一行 由于数据是动态的,它可能包含更多的字符串,而不是一个字符串,所以我必须在其中添加一个循环和一些条件,以便将变量中的值保存在新行中 以新行格式存储在变量中的字符串: "CA 1938" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1937" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1934" "XXXXXXXXXXXXXXXXX

我是Unix脚本新手,我正在尝试编写一个脚本,它应该能够附加新行字符,并将变量中的值打印到新行中,而不是同一行

由于数据是动态的,它可能包含更多的字符串,而不是一个字符串,所以我必须在其中添加一个循环和一些条件,以便将变量中的值保存在新行中

以新行格式存储在变量中的字符串:

"CA 1938" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1937" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "CA 1934" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
我的想法是编写一些正则表达式比较,并使用它在这个变量表中插入新行

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
实际产量为

CA 1938 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1937 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA 1934 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA
1938
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA
1937
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
CA
1934
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

所以上面的实际输出是因为
$i
是所有由空格分隔的字符串值。你能帮我弄到我要找的东西吗。实际上,这是CA(任务编号)和XX(任务描述)。

使用
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
var='CA 1938 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CA 1937 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CA 1934 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

grep-oE'CA\s+\s+\s+\s+'如果没有正确解析输入,
for
将中断
var
变成空格分隔的部分(基于
IFS
),因此实际上 为
var
中的每个“单词”添加新行,而不是为每个标记添加新行

正如您所建议的,我将使用带有
sed-r
的正则表达式来正确解析它,并将其保存到变量中:

p=$(echo$var | sed-r's/(CA\s+\s+/\1\n/g'))
\S
匹配任何非空白字符,
+
匹配“一个或多个字符”,因此正则表达式在每个“CA”处将输入分成行,后跟两个字。

这应该可以:

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

非常感谢您的帮助。请您解释一下CA\s+\s+\s+\s+。
grep
将在自己的行上打印每个匹配的字符串。它正在查找文本
CA
,然后是一个或多个空格
\s+
,一个或多个非空格
\s+
(您的
1938
1937
,等等),一个或多个空格,然后是一个或多个非空格(您的
XXXXXX…
)。@Llama先生:非常感谢您的评论。是的,这就是正则表达式所做的。谢谢你们的回答。我认为你们的例子是错误的。您使用反勾号定义
var
,然后从不使用它。此外,
p
i
从未定义。我也怀疑你是否。。。完成
是故意的,没有循环。你点击了CA而不是其他表情我喜欢,兄弟,谢谢。