從命令列在文件每一行的開頭添加字串的最簡單方法是什麼?

從命令列在文件每一行的開頭添加字串的最簡單方法是什麼?

我正在尋找一種方法,將一些字串添加到每行的開頭(每行使用相同的字串)。不是可自訂的,而是易於記住並在每個 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

相關內容