2016-08-02 71 views
1

在Linux C Shell中,我需要用包含一組數字和字符串的變量替換文件中的一行。我正在使用printf,xargs和sed的組合來保存this answer所建議的格式。 這是我的代碼到現在(我找不到在csh一個更簡單的方法):xargs不保留格式爲012的前導空格

> echo " 2 2 2 2 2 2 2 2  Number of gradient directions" > myfile.txt 
> set ndir = `repeat 8 printf ' 2'` 
> set ndir[1] = 16 
> set afmt1 = `repeat 8 printf '%%3d'` 
> set afmt = "$afmt1%s" 
> printf "$afmt" $ndir "  Number of gradient directions" | xargs -I '{}' sed -i '/Number of gradient directions/c\{}' myfile.txt 

結果是:

> cat myfile.txt 
16 2 2 2 2 2 2 2  Number of gradient directions 

但我需要:

> cat myfile.txt 
16 2 2 2 2 2 2 2  Number of gradient directions 

唯一的問題是該行僅爲變量$ ndir的第一個索引丟失了%3d格式。我需要保留整條線的格式。有沒有更微妙的方式或修復這種方式?

回答

1

添加-d'\n'xargs命令:

printf "$afmt" $ndir "  Number of gradient directions" | xargs -d'\n' -I '{}' sed -i '/Number of gradient directions/c\{}' myfile.txt 

的問題是,xargs裝飾用-I時,你可以驗證從每個輸入行開頭的空白如下:

% echo ' A B ' | xargs -I {} echo "[{}]" 
[A B ] 

添加選項-d'\n'會取消激活此行爲並導致整個行按原樣傳遞:

% echo ' A B ' | xargs -d'\n' -I {} echo "[{}]" 
[ A B ] 

順便(未在Linux相關):

BSD/OSX xargs不僅修剪前緣和與-I結尾的空白,它也歸線內部空白;由於BSD/OSX xargs不支持-d選項,需要以下解決方法傳遞線路原樣(也將與GNU xargs工作):

% echo ' A B ' | tr '\n' '\0' | xargs -0 -I {} echo "[{}]" 
[ A B ] 
+0

你是驚人的,謝謝。我改變了我的問題的標題,以便其他人可以更容易地找到他們的相關問題。 –

+0

@ S.M .:我的榮幸 - 感謝您更新問題的標題。 – mklement0