我有一个文件,想要使用cat将其修改为一个新文件。所以文件包含如下行:
name "myName"
place "xyz"
我希望你能将这些行改为
name "Jon"
place "paris"
我试图这样做,但它并没有起作用:
cat originalFile | sed 's/^name\*/name "Jon"/' > tempFile
我尝试使用各种特殊字符,但没有成功。我无法识别“name”后面的空格字符以及“myName”。
您可以使用.*
匹配行的其余部分,并且可以使用空格或[[:blank:]]
或[[:space:]]
来匹配空格:
最初的回答
sed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' originalFile > tempFile
请注意这里有两个替换命令,用s分号连接。第一部分用一个捕获组包裹起来是必要的,因为空格POSIX字符类不是文字字符,在替换后保留它需要使用\1
反向引用(插入通过组1捕获的文本)。
请参见在线演示:
s='name "myName"
place "xyz"'
sed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' <<< "$s"
输出:
name "Jon"
place "paris"
[[:space:]]
,它可以同时适用于\t
或普通空格。 - Tilsed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' originalFile > tempFile
。 - Wiktor Stribiżewawk
的替代方案:awk '$1=="name"{$0="name \"Jon\""} $1=="place"{$0="place \"paris\""} 1' originalFile
如果在name
或place
之前有空格,它将起作用。
这里不是正则表达式匹配,而只是字符串比较。
awk
通过包括\n
或的空格字符分隔字段。
当结果看起来正确时,请附加> tempFile
。
sed 's/^name .*/name "Jon"/;s/^place .*/place "paris"/' originalFile > tempFile
? - Wiktor Stribiżewsed -E 's/^(name).*(place).*/\1 "Jon" \2 "Paris"/g' filename
,这样做不好吗? - Mostafa Hussein\1
和\2
来调用它,另外我使用了扩展正则表达式但你没有。这让我想知道是否有任何重大的区别使你更喜欢以这种方式编写?我知道你是正则表达式方面的专家:D - Mostafa Hussein