2017-04-13 13 views
-2

特定の行に* charを追加したいファイルがあります。その行の特定の場所にファイルがあります。特定の行と位置の文字をbashに入れ替える方法

これは可能ですか?

あなたは

+0

あなたは部分文字列を使用することができます。https://stackoverflow.com/documentation/bash/502/shell-parameter-expansion/ 1654/substrings-and subarrays#t = 201704131226548345467 – Sundeep

+1

はい、可能です – Kent

+0

サブストリングを使用して1行だけで動作します。テストファイル内の特定の行を変更する(文字を追加する)にはどうすればよいですか? – DCuser

答えて

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 

上記のテストでは、我々はLINE2の第四文字の後にアスタリスクを入力します。
ファイル上で動作し、ファイルに直接変更を加えたい場合は、使用sed -E -i '....'

同じ結果にもGNUのawkを用いて達成することができる。純粋なbashで

awk 'BEGIN{OFS=FS=""}NR==2{sub(/./,"&*",$4)}1' <<<"$a" 

あなたと出力の上に達成することができます

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を使用することをお勧めします。あなたは第五列の2行目にアスタリスクを挿入する場合:

sed -r "2s/^(.{5})(.*)$/\1*\2/" myfile.txt 

2sあなたは2行目に置換を実行しようとしていると言います。 ^(.{5})(.*)$は、行の先頭から5文字、その後のすべての文字を取っていると言います。 \1*\2は、最初の一致(つまり5つの先頭文字)から文字列を作成してから、*に2番目の一致文字(つまり、行末までの文字)を作成しているとします。

あなたの行と列は、あなたが行うことができます変数である場合はそのような何か:

_line=5 
_column=2 
sed -r "${_line}s/^(.{${_column}})(.*)$/\1*\2/" myfile.txt 
関連する問題