如何在特定的线和位置上打击一个字符

时间:2017-04-13 12:14:45

标签: bash char

我有一个文件,我想在特定行上添加* char,并在该行的特定位置添加。

这可能吗?

谢谢

2 个答案:

答案 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