elif条件声明不起作用

时间:2011-02-17 09:38:00

标签: linux shell

我有这个文件:

The number is %d0The number is %d1The number is %d2The number is %d3The number is %d4The number is %d5The number is %d6The...
The number is %d67The number is %d68The number is %d69The number is %d70The number is %d71The number is %d72The....
The number is %d117The number is %d118The number is %d119The number is %d120The number is %d121The number is %d122

我想填写它:

The number is %d0  The number is %d1  The number is %d2  The number is %d3  The number is %d4  The number is %d5  The number is %d6 
The number is %d63 The number is %d64 The number is %d65 The number is %d66 The number is %d67 The number is %d68 The number is %d69
d118The number is %d119The number is %d120The number is %d121The number is %d122The number is %d123The number is %d124The

请告诉我如何通过shell脚本来完成它 我正在使用Linux

1 个答案:

答案 0 :(得分:1)

修改

这个单一命令管道应该做你想要的:

sed 's/\(d[0-9]\+\)/\1   /g;s/\(d[0-9 ]\{3\}\) */\1/g' test2.txt >test3.txt
#                      ^ three spaces here

<强>解释

对于“d”后面的每个数字序列,在它后面添加三个空格。 (我将使用“X”来表示空格。)

d1   becomes d1XXX
d10  becomes d10XXX
d100 becomes d100XXX

现在(分号后面的部分),捕获每个“d”和下一个必须是数字或空格的三个字符并输出它们,但不输出任何空格。

d1XXX   becomes d1XX
d10XXX  becomes d10X
d100XXX becomes d100

如果您想要在示例数据中显示您想要显示的行,请执行以下操作:

sed 's/\(d[0-9]\+\)/\1   /g;s/\(d[0-9 ]\{3\}\) */\1/g' test2.txt | fold -w 133 >test3.txt

您可能需要调整fold命令的参数以使其正确显示。

不需要ifgrep,循环等。

原始回答:

首先,你真的需要说明你正在使用哪个shell,但由于你有eliffi,我假设它是Bourne派生的。

基于这个假设,你的脚本毫无意义。

  • ifelif的括号是不必要的。在这种情况下,他们创建了一个无用的子shell。
  • sedif中的elif命令说“如果找到模式,复制保留空间(顺便说一下,它是空的)到模式空间并输出并输出所有其他行。
  • 第一个sed命令将始终为真,因此永远不会执行elif。除非出现错误,否则sed始终返回true。

这可能是你想要的:

if grep -Eqs 'd[0-9]([^0-9]|$)' test2.txt; then
    sed 's/\(d[0-9]\)\([^0-9]\|$\)/\1  \2/g' test2.txt >test3.txt
elif grep -Eqs 'd[0-9][0-9]([^0-9]|$)' test2.txt; then
    sed 's/\(d[0-9][0-9]\)\([^0-9]\|$\)/\1 \2/g' test2.txt >test3.txt
else
    cat test2.txt >test3.txt
fi

但是我想知道是否所有这些都可以被这样的单行代替:

sed 's/\(d[0-9][0-9]?\)\([^0-9]\|$\)/\1 \2/g' test2.txt >test3.txt

由于我不知道test2.txt的样子,所以部分原因只是猜测。