我正在尋找一種方法,將一些字串添加到每行的開頭(每行使用相同的字串)。不是可自訂的,而是易於記住並在每個 POSIX 相容平台(以及每個 shell)上可用的東西。
答案1
:|paste -d'foo ' - - - - input > output
(開玩笑,儘管您可能會發現它是此處發布的所有解決方案中最快的:-b)。
規範的方法是:
sed 's/^/foo /' < input > output
然而,它不容易適應任意字串。例如,
sed "s/^/$var /"
僅當$var
不包含 、&
、\
或/
換行符時才有效,並且至少在無法保證的情況下是 GNU sed 中的任意命令執行漏洞。
在這方面,
export var
awk '{print ENVIRON["var"], $0}'
或者
perl -pe '$_="$ENV{var} $_"'
會工作得更好。
答案2
您可以使用sed
:
sed -i 's/^/your_string /' your_file
感謝 Stephane 和 Marco 的評論,請注意該-i
選項不是 POSIX。執行上述操作的 POSIX 方法是
sed 's/^/your_string /' your_file > tmp_copy && mv tmp_copy your_file
或者perl
:
perl -pi -e 's/^/your_string /' your_file
解釋
這兩個指令都執行正規表示式替換,將行的開頭 ( ^
) 替換為所需的字串。兩個命令中的開關-i
確保文件被就地編輯(即更改反映在文件中而不是打印到標準輸出)。
sed
應該可以在任何與 POSIX 相容的作業系統上使用,並且perl
應該可以在大多數現代的 Unices 上使用,除了那些已經經過努力刪除它。
答案3
我提出了一個使用awk
前綴字串“foo”的解決方案。
awk '{ print "foo", $0; }' input > output
awk
是跨平台的,可在任何 POSIX 系統上使用。它不進行就地編輯。如果您想編輯一個文件而不建立第二個文件,則必須使用臨時文件。請參閱約瑟夫的sed
回答,它顯示了語法。另一個技巧是使用以下語法,基本上是建立一個與原始檔案具有相同檔案名稱的臨時檔案。
{ rm file; awk '{ print "foo", $0 }' > file; } < file
答案4
您可以使用perl
以下方法來執行此操作:
$ perl -pi -e 's/^/mystring /' afile.txt
例子
建立範例文件。
$ seq 5 > afile.txt
$ cat afile.txt
1
2
3
4
5
運行上面的命令:
$ perl -pi -e 's/^/mystring /' afile.txt
$ cat afile.txt
mystring 1
mystring 2
mystring 3
mystring 4
mystring 5