我的档案是:

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上工作

最佳答案

编辑:
此单一命令管道应执行所需的操作:

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,我假设它是伯恩派生的。
基于这个假设,你的剧本毫无意义。
ifelif的括号是不必要的。在这种情况下,它们创建一个不起作用的子shell。
sedif中的elif命令说“如果找到了模式,请将保持空间(顺便说一下,它是空的)复制到模式空间并输出它并输出所有其他行。
第一个sed命令将始终为true,因此永远不会执行elifsed除非有错误,否则始终返回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是什么样子,所以这只是猜测。

关于linux - elif条件语句不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5027196/

10-11 00:56