2017-04-13 81 views
-2

我有一個文件,我想在特定行上添加* char,並在該行的特定位置。如何插入bash在特定行中的字符和位置在線

這可能嗎?

謝謝

+0

你可以使用字符串:https://stackoverflow.com/documentation/bash/502/shell-parameter-expansion/ 1654 /子串和子排列#t = 201704131226548345467 – Sundeep

+1

是的,有可能 – Kent

+0

使用子串只適用於一行,對吧?如何在我的測試文件中更改(添加字符)特定行? – DCuser

回答

1

您可以使用可用的一種外部工具的操作,如awk或者sed數據。您可以直接從您的命令行使用此工具或將其包含在您的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 

在上述試驗中,我們進入LINE2的第四炭後一個星號。
如果你想上的文件進行操作並直接對文件的更改,然後使用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}" 
+0

@DCuser歡迎。我將嘗試包括一個純粹的bash解決方案。 –

+0

@DCuser添加了純粹的bash解決方案。 –

+0

但這種方法只是打印修改後的行,它並不能代替包含該行的文件的內容......對嗎? – DCuser

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 
相關問題