Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux CLI中,按特定行上的位置替换特定字符_Linux_Bash_Unix - Fatal编程技术网

在linux CLI中,按特定行上的位置替换特定字符

在linux CLI中,按特定行上的位置替换特定字符,linux,bash,unix,Linux,Bash,Unix,我想用另一个字符替换某行上的某个字符,该字符必须通过数字而不是身份来标识 假设我想修改它,使第四行的第二个*是一个X ****\n****\n****\n**** 看起来是这样的 ****\n****\n****\n*X** 由于每个字符都是*字符,我无法区分这些字符,所以我想按位置进行区分。有什么方法可以做到这一点吗?使用GNU: row="4" col="2" sed -E "${row}"'s/(.{'"$(($col-1))"'})./\1X/' file 输入(文件): ****

我想用另一个字符替换某行上的某个字符,该字符必须通过数字而不是身份来标识

假设我想修改它,使第四行的第二个
*
是一个
X

****\n****\n****\n****
看起来是这样的

****\n****\n****\n*X**
由于每个字符都是
*
字符,我无法区分这些字符,所以我想按位置进行区分。有什么方法可以做到这一点吗?

使用GNU:

row="4"
col="2"
sed -E "${row}"'s/(.{'"$(($col-1))"'})./\1X/' file
输入(文件):

**** **** **** **** 输出:

**** **** **** *X** **** **** **** *X**
Perl版本非常可读:

perl -pe 'substr($_,2,1)="X" if $.==3' file
****
****
**X*
****

您只需要知道,
$表示当前行的内容,
$。
表示行号。

我会使用
awk
,因为它不需要使用正则表达式就可以实现,这使得它非常高效

使用
gawk
可以使用空字符串
-F'
作为分隔符,按字符分割输入行:

gawk -v ln=4 -v col=2 -v val='X' -F '' 'BEGIN{OFS=""}NR==ln{$col=val}1' file
位置正确,因此便于携带的是:

awk -v ln=4 -v col=2 -v val='X' \
    'NR==ln{printf "%s%s%s\n",substr($0,1,col-1),val,substr($0,col+1);next}1' file

您可以使用sed替换第n次出现的
s
命令和
s/bre/rep/
。只是
“$row”'s//X/'“$((col-1))”
我不会在这里使用
sed
<应该使用code>awk
,因为它不需要使用正则表达式就可以做到这一点。特别是因为问题被标记为
awk
我认为没有理由在这里发布
sed
。您在错误的行中替换了错误的字符。天啊!,我的所有数据现在都丢失了。:)有趣的是,我之前确实这么做了,但没有设置OFS的
,结果都是双倍行距!如果
FS
是一个固定字符串,我经常希望awk在默认情况下使用
OFS=FS
。但我相信埃德蒙顿可以解释为什么这是个坏主意:)阅读,是不是
awk
这里的正确工具?@WalterA这是一个很好的观点。如果FS是空字符串,则posix未定义其行为。需要使用Looks
substr()
才能符合posix。让我补充一点
awk -v ln=4 -v col=2 -v val='X' \
    'NR==ln{printf "%s%s%s\n",substr($0,1,col-1),val,substr($0,col+1);next}1' file