将文本附加到文件中的特定行 bash
appending text to specific line in file bash
所以我有一个文件,其中包含一些由“,”分隔的文本行。我想创建一个脚本来计算一行有多少部分,如果该行包含 16 个部分我想添加一个新部分。到目前为止它工作得很好。唯一不起作用的是在末尾附加“,”。请参阅下面的示例:
原文件:
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
预期结果:
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
这是我的代码:
while read p; do
if [[ $p == "HEA"* ]]
then
IFS=',' read -ra ADDR <<< "$p"
echo ${#ADDR[@]}
arrayCount=${#ADDR[@]}
if [ "${arrayCount}" -eq 16 ];
then
sed -i "/$p/ s/$/,xx/g" $f
fi
fi
done <$f
结果:
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
,xx
我做错了什么?我确定它有点小,但我找不到它..
可以用awk来完成:
awk -F, 'NF==16{[=10=] = [=10=] FS "xx"} 1' file
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
-F,
将输入字段分隔符设置为逗号
NF==16
是表示在 {
和 }
中执行块的条件,如果字段数为 16
[=15=] = [=15=] FS "xx"
在行尾附加 xx
1
是默认的 awk 操作,表示打印输出
对于使用 sed 的答案应该如下:
- 使用
${line_number} s/..../..../
格式-针对特定行,您需要先找出行号。
- 使用特殊字符
&
表示匹配的字符串
sed 语句应如下所示:
sed -i "${line_number}s/.*/&xx/"
我宁愿把它留给你去玩,但如果你愿意,我可以给你一个完整的工作示例。
所以我有一个文件,其中包含一些由“,”分隔的文本行。我想创建一个脚本来计算一行有多少部分,如果该行包含 16 个部分我想添加一个新部分。到目前为止它工作得很好。唯一不起作用的是在末尾附加“,”。请参阅下面的示例:
原文件:
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
预期结果:
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
这是我的代码:
while read p; do
if [[ $p == "HEA"* ]]
then
IFS=',' read -ra ADDR <<< "$p"
echo ${#ADDR[@]}
arrayCount=${#ADDR[@]}
if [ "${arrayCount}" -eq 16 ];
then
sed -i "/$p/ s/$/,xx/g" $f
fi
fi
done <$f
结果:
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
,xx
我做错了什么?我确定它有点小,但我找不到它..
可以用awk来完成:
awk -F, 'NF==16{[=10=] = [=10=] FS "xx"} 1' file
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
b,b,b,b,b,b
a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,xx
-F,
将输入字段分隔符设置为逗号NF==16
是表示在{
和}
中执行块的条件,如果字段数为 16[=15=] = [=15=] FS "xx"
在行尾附加xx
1
是默认的 awk 操作,表示打印输出
对于使用 sed 的答案应该如下:
- 使用
${line_number} s/..../..../
格式-针对特定行,您需要先找出行号。 - 使用特殊字符
&
表示匹配的字符串
sed 语句应如下所示:
sed -i "${line_number}s/.*/&xx/"
我宁愿把它留给你去玩,但如果你愿意,我可以给你一个完整的工作示例。