用一个输出文件替换shell脚本中的多行

用一个输出文件替换shell脚本中的多行,shell,sed,Shell,Sed,我有一个文件Length.txt逐行显示多个名称(40)。 我想写一个小的shell脚本,它将计算文件每行的字符数,如果计数小于9,则将这些行替换为在每行末尾添加8个空格和1 例如,如果名称为 XXXXXX 替换为 XXXXXX 1 我尝试了下面的编码。它对我来说很有用,但是每当它替换行时,它都会一次显示所有行。 因此,假设我在Length.txt中有40行,其中4行少于9个字符,那么我的输出有160行。 有人能帮我只显示40行输出和4行更改吗 #!/usr/bin/sh #s

我有一个文件
Length.txt
逐行显示多个名称(40)。 我想写一个小的shell脚本,它将计算文件每行的字符数,如果计数小于9,则将这些行替换为在每行末尾添加8个空格和1

例如,如果名称为

XXXXXX
替换为

XXXXXX        1
我尝试了下面的编码。它对我来说很有用,但是每当它替换行时,它都会一次显示所有行。 因此,假设我在
Length.txt
中有40行,其中4行少于9个字符,那么我的输出有160行。
有人能帮我只显示40行输出和4行更改吗

#!/usr/bin/sh
#set -x

while read line;
do
count=`echo $line|wc -m`
        if [ $count -lt 9 ]
        then
        Number=`sed -n "/$line/=" Length.txt`;
        sed -e ""$Number"s/$line/$line       1/" Length4.txt
        fi
done < Length.txt
#/usr/bin/sh
#集合x
读行时;
做
count=`echo$line | wc-m`
如果[$count-lt 9]
然后
Number=`sed-n/$line/=“Length.txt`;
sed-e“$Number”s/$line/$line 1/”Length4.txt
fi
done
$cat foo.input
我超过9个字符
我也超过9个字符
我不是
又一条长队
短的
$whilereadline;不打印“$line”;(${line}<9))&&printf“1”;回声;完成
$cat foo.input
我超过9个字符
我也超过9个字符
我不是
又一条长队
短的
$whilereadline;不打印“$line”;(${line}<9))&&printf“1”;回声;完成
让我告诉您脚本有什么问题。脚本中唯一缺少的是,您需要使用
sed-i
编辑文件,并在进行替换后重新保存

我假设Length4.txt只是Length.txt的一个副本

我在脚本中添加了
sed-I
,现在应该可以工作了:

cp Length.txt Length4.txt
while read line;
do
count=`echo $line|wc -m`
        if [ $count -lt 9 ]
        then
        Number=`sed -n "/$line/=" Length.txt`
        sed -ie ""$Number"s/$line/$line       1/" Length4.txt
        fi
done < Length.txt

让我告诉你你的剧本有什么问题。脚本中唯一缺少的是,您需要使用
sed-i
编辑文件,并在进行替换后重新保存

我假设Length4.txt只是Length.txt的一个副本

我在脚本中添加了
sed-I
,现在应该可以工作了:

cp Length.txt Length4.txt
while read line;
do
count=`echo $line|wc -m`
        if [ $count -lt 9 ]
        then
        Number=`sed -n "/$line/=" Length.txt`
        sed -ie ""$Number"s/$line/$line       1/" Length4.txt
        fi
done < Length.txt

单个sed命令可以执行以下操作:

sed -E 's/^.{,8}$/&        1/' file
要修改文件内容,请添加
-i

sed -iE 's/^.{,8}$/&        1/' file
部分输出:

94605320        1
105018263
2475218231
7728563        1
        1

*修正为只包含8个空格而不是9个空格,并包含空行。如果您不想处理空行,请使用
{1,8}

单个sed命令即可:

sed -E 's/^.{,8}$/&        1/' file
$ awk -v FS= 'NF<9{$0=sprintf("%s%*s1",$0,8,"")} 1' file
XXXXXX        1
要修改文件内容,请添加
-i

sed -iE 's/^.{,8}$/&        1/' file
部分输出:

94605320        1
105018263
2475218231
7728563        1
        1

*修正为只包含8个空格而不是9个空格,并包含空行。如果您不想处理空行,请使用
{1,8}

$awk-vfs='NF
$awk-vfs='NF“有人能帮我在4行更改的情况下只显示40行输出吗?”是的,我们可以帮助。“有人能帮我在4行更改的情况下只显示40行输出吗?”是的,我们可以提供帮助。+1实际上指出了原始代码段的问题,并且没有我那么懒:-)@user2642751看起来您的
sed
版本不支持
-I
。您可以改为使用临时文件,如下所示:
sed-e“$Number”s/$line/$line 1/“Length4.txt>Length4.tmp&&mv Length4.tmp Length4.txt
。但我强烈建议您使用另一种方法。+1实际上指出了原始代码段的问题,并且不像我那么懒:-)@user2642751看起来您的
sed
版本不支持
-I
。您可以改为使用临时文件,如下所示:
sed-e“$Number”s/$line/$line 1/“Length4.txt>Length4.tmp&&mv Length4.tmp Length4.txt
。但我强烈建议你使用另一种方法。那实际上更优雅,+1。那实际上更优雅,+1。
$ awk -v FS= 'NF<9{$0=sprintf("%s%*s1",$0,8,"")} 1' file
XXXXXX        1