如何在BASH中查找和替换文件每行中模式的第一个匹配项?
我需要在文件的每一行中查找第一次出现的如何在BASH中查找和替换文件每行中模式的第一个匹配项?,bash,awk,sed,Bash,Awk,Sed,我需要在文件的每一行中查找第一次出现的,,并将其替换为1,,例如: 0001,mountain,a big rock 0002,tree,a tall plant 0003,whale,a big fish 0004,lion,a big cat 0005,iPhone,a small computer 输出如下所示: 00011,mountain,a big rock 00021,tree,a tall plant 00031,whale,a big fish 00041,lion,a bi
,
,并将其替换为1,
,例如:
0001,mountain,a big rock
0002,tree,a tall plant
0003,whale,a big fish
0004,lion,a big cat
0005,iPhone,a small computer
输出如下所示:
00011,mountain,a big rock
00021,tree,a tall plant
00031,whale,a big fish
00041,lion,a big cat
00051,iPhone,a small computer
我所知道的唯一解决方案是使用while循环,这对长文件来说需要很长时间:
while read -r line
do
sed -i 's/,/1,/' file.csv
done < file.csv
读取时-r行
做
sed-i's/,/1,/'file.csv
完成
如何在文件中的每一行上查找并替换模式的第一个匹配项?循环是不必要的。只需在不使用循环的情况下运行sed命令,它将一次性处理整个文件
sed -i 's/,/1,/' file.csv
循环是不必要的。只需在不使用循环的情况下运行sed命令,它将一次性处理整个文件
sed -i 's/,/1,/' file.csv
您可以在纯Bash中使用以下工具完成此操作:
new_lines=()
while IFS= read -r line || [[ $line ]] ; do
new_lines+=( "${line/,/1,}" )
done <file.csv
printf '%s\n' "${new_lines[@]}" >file.csv
您可以在纯Bash中使用以下工具完成此操作:
new_lines=()
while IFS= read -r line || [[ $line ]] ; do
new_lines+=( "${line/,/1,}" )
done <file.csv
printf '%s\n' "${new_lines[@]}" >file.csv
你也可以通过awk来做到这一点
$ awk '{sub(/,/,"1,")}1' file
00011,mountain,a big rock
00021,tree,a tall plant
00031,whale,a big fish
00041,lion,a big cat
00051,iPhone,a small computer
你也可以通过awk来做到这一点
$ awk '{sub(/,/,"1,")}1' file
00011,mountain,a big rock
00021,tree,a tall plant
00031,whale,a big fish
00041,lion,a big cat
00051,iPhone,a small computer
既然要编辑文件,为什么不使用标准编辑器ed
ed -s file < <(printf '%s\n' ',s/,/1,/' 'wq')
既然要编辑文件,为什么不使用标准编辑器ed
ed -s file < <(printf '%s\n' ',s/,/1,/' 'wq')
你的while循环毫无意义。这完全没有必要。只要使用sed命令,while循环就没有意义了。这完全没有必要。只需使用sed命令。