我有这个文件:
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
答案 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
命令的参数以使其正确显示。
不需要if
,grep
,循环等。
原始回答:
首先,你真的需要说明你正在使用哪个shell,但由于你有elif
和fi
,我假设它是Bourne派生的。
基于这个假设,你的脚本毫无意义。
if
和elif
的括号是不必要的。在这种情况下,他们创建了一个无用的子shell。sed
和if
中的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
的样子,所以部分原因只是猜测。