我的档案是:
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
命令的参数,使其正确输出。不需要
if
,grep
,循环等。原始答案:
首先,您确实需要说明您使用的是哪个shell,但是既然您有
elif
和fi
,我假设它是伯恩派生的。基于这个假设,你的剧本毫无意义。
if
和elif
的括号是不必要的。在这种情况下,它们创建一个不起作用的子shell。sed
和if
中的elif
命令说“如果找到了模式,请将保持空间(顺便说一下,它是空的)复制到模式空间并输出它并输出所有其他行。第一个
sed
命令将始终为true,因此永远不会执行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
是什么样子,所以这只是猜测。关于linux - elif条件语句不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5027196/