我有一个文件,我想在特定行上添加* char,并在该行的特定位置添加。
这可能吗?
谢谢
答案 0 :(得分:1)
您可以使用一种外部工具来操作sed或awk等数据。您可以直接从命令行使用此工具,也可以将其包含在bash脚本中。
示例:
$ a="This is a test program that will print
Hello World!
Test programm Finished"
$ sed -E '2s/(.{4})/&\*/' <<<"$a" #Or <file
#Output:
This is a test program that will print
Hell*o World!
Test programm Finished
在上面的测试中,我们在第2行的第4个字符后面输入一个星号
如果您想对文件进行操作并直接对文件进行更改,请使用sed -E -i '....'
使用gnu awk也可以实现相同的结果:
awk 'BEGIN{OFS=FS=""}NR==2{sub(/./,"&*",$4)}1' <<<"$a"
在纯粹的bash中,您可以使用以下内容实现上述输出:
while read -r line;do
let ++c
[[ $c == 2 ]] && printf '%s*%s\n' "${line:0:4}" "${line:4}" || printf '%s\n' "${line}"
# alternative:
# [[ $c == 2 ]] && echo "${line:0:4}*${line:4}" || echo "${line}"
done <<<"$a"
#Alternative for file read:
# done <file >newfile
如果您的变量只是一行,则不需要循环。您可以直接执行此操作:
printf '%s*%s\n' "${a:0:4}" "${a:4}"
# Or even
printf '%s\n' "${a:0:4}*${a:4}" #or echo "${a:0:4}*${a:4}"
答案 1 :(得分:0)
我建议使用sed
。如果要在第5列的第2行插入星号:
sed -r "2s/^(.{5})(.*)$/\1*\2/" myfile.txt
2s
说你打算在第二行进行替换。 ^(.{5})(.*)$
表示你从行的开头拿出5个字符,然后是所有字符。 \1*\2
表示您正在构建第一个匹配项(即5个开头字符)的字符串,然后是*
,然后是第二个匹配(即字符直到行尾)。
如果您的行和列在变量中,您可以执行以下操作:
_line=5
_column=2
sed -r "${_line}s/^(.{${_column}})(.*)$/\1*\2/" myfile.txt